Test/Unit integration test w Capybara - how to manually set data in the test

I am trying to do the following in a Test/Unit integration test using
Capybara. Very basic Rails 3 app, Ruby 1.9.2 just with the pg and
capybara
gems, thats it.

Everything works except that the Person object I create manually in the
test
does not show in the test database… or any other database I can find!
But
Person.all returns him, so he is getting created somewhere. Then, when
Capybara/Selenium go to the browser which I have verified does hit the
test
database fine (through another test), I get an empty list of people on
the
index page.

Capybara/Selenium have the Rails.env correct in terms of hitting the db
correctly. The Test itself says Rails.env = “test”, the data does not go
into the test db. Where is the data getting saved? And how can I
manually
set up data in an Integration test before running Capybara? I thought
maybe
that Capybara was somehow triggering the database being emptied but the
sequence below proves this is not the case:

def test_see_yoohoo
person = Person.new
person.name = “Yoohoo”
person.email = “[email protected]
assert person.save # passes
assert Person.find_by_name(“Yoohoo”) # passes but in dbconsole
"select

  • from people" in the test database (or dev database) returns no rows
    assert_equal Rails.env, “test” # passes

    visit “/people” #
    page
    loads fine… Capybara/Selenium working…
    assert page.has_content?(‘Yoohoo’) # fails (page has
    empty
    list… the list passes fine on another page so issue is not the view)
    assert page.has_content?(‘[email protected]’)
    end

On Sun, Dec 12, 2010 at 9:11 AM, David K.
[email protected]wrote:

person.email = "[email protected]"
assert page.has_content?('[email protected]')

end

TestUnit methods are wrapped in a transaction, with every transaction
being
rollbacked after the method finishes.

You can set use_transactional_fixtures = false if you want to change
this
behavior.

http://api.rubyonrails.org/classes/Fixtures.html

HTH


Erol M. Fornoles

http://twitter.com/erolfornoles
http://ph.linkedin.com/in/erolfornoles

On Sat, Dec 11, 2010 at 7:38 PM, Erol F.
[email protected]wrote:

database fine (through another test), I get an empty list of people on the
person = Person.new
assert page.has_content?(‘Yoohoo’) # fails (page has
behavior.

Thanks! At first I did not believe this was the issue but I tried and it
worked. So what I learned is that even though my calls to Capybara are
within a single method the transactional fixture object is its own
world. So
it seems the ‘transaction’ never hits the db, right, so the tests are
faster?

And so when the browser boots this is hitting a new transaction… and
thus
the data I just created is gone.

David K. wrote in post #967876:

I am trying to do the following in a Test/Unit integration test using
Capybara. Very basic Rails 3 app, Ruby 1.9.2 just with the pg and
capybara
gems, thats it.
[…]

Is there any particular reason that you are torturing yourself this way
instead of using Cucumber? :slight_smile:

Best,

Marnen Laibow-Koser
http://www.marnen.org
[email protected]