I cannot get request specs working when using Javascript.
My specs pass if I run them without Javascript (the page is built to work with or without JS).
Specifically, the specs fail when I do assertions like Post.should have(1).record.
Capybara just doesn’t pick up the records from the DB, and the database is not cleaned between runs.
I’ve tried using DatabaseCleaner with transactional fixtures disabled – the common approach to this, I guess. No dice.
I’ve also tried (and, would ideally prefer) running without DatabaseCleaner, using transactional fixtures and forcing AR to share the same connection between threads (a patch described by José Valim). Again, no dice.
Additionally, I’ve also tried switching between Capybara-webkit and Selenium – the issue persists.
I’ve put up a sample app with just a basic Post scaffold, that replicates the problem: https://github.com/cabgfx/js-specs
There’s a spec_helper.rb with transactional fixtures and AR shared connection, and a spec_helper_database_cleaner.rb for the other scenario.
I normally use Spork, but I’ve disabled it in both spec_helper.rb files, just to eliminate a potential point of failure (in both apps; the “real” one and the sample app).
I develop locally using Pow on a Macbook Air, running OS X 10.7.3 with MRI 1.9.3 thru RVM. (I also tried on 1.9.2).
Hope I’m making sense – any guidance/help/pointers are greatly appreciated!
Matt – thanks a lot for taking time to assist me!
I tried setting it up with your spec_helper, using Selenium as the javascript driver.
The spec still failed – but I could see the correct behavior being executed in Firefox…
Then it dawned on me, that the problem might occur because of Capybara not waiting for AJAX requests to finish.
I then reverted to my initial spec_helper (with Spork and no DatabaseCleaner), and simply used Capybara’s
wait_until { page.has_content? "text I'm inserting with JS" }.I updated the sample app, and just added
sleep 1in the request spec, so you can see for yourself. It now works with and without Spork, and the AR monkey patch seems to work perfectly.