我很难让Poltergeist和RSpec很好地合作。
我写了以下测试:
it "allows the trainer to view a runner" do
visit '/'
all(:xpath,'//a[@id="get-started"]').first.click
fill_in :name, with: "New Admin"
fill_in :email, with: "admin@test.org"
fill_in :password, with: "letmein"
fill_in :password_confirmation, with: "letmein"
all(:xpath,'//input[@id="get-started-submit"]').first.click
@runner_1 = FactoryGirl.create(:runner, name: "Axel", email: "axel@test.org")
visit '/runners/axel'
debugger
实际上,上面所做的是使用密码'letmein'注册'New Admin',然后尝试查看'Axel'的跑步者个人资料页面。
调试器中断的地方,我可以看到@ runner_1(Axel)已经创建:
Runner.friendly.find('axel')
>> #<Runner id: 2, email: "axel.manzano@hotmail.fr",........>
然而,当试图访问'/ runners / axel'时,Poltergeist报道:
ActiveRecord::RecordNotFound
这不是路线问题,也不是问题。
事实上,在进一步探讨了这个错误之后,似乎在测试文件中创建的任何内容实际上都没有在Poltergeist正在访问的环境中进行设置。
我似乎无法理解为什么。非常感谢任何帮助。
答案 0 :(得分:4)
有可能,您正在使用rspec中的“事务夹具”。这意味着每个测试都在数据库事务中运行,该事务在测试结束时回滚,以便每个测试都有一个干净的数据库。
其他线程/程序可以不查看交易中发生的事情。 Poltergeist在单独的线程中运行服务器,这意味着它无法在rspec中看到任何写入数据库的内容(尽管可以直接从rspec代码访问)。
有a description of this phenomenon on the capybara homepage。解决方案是在rspec-rails中禁用事务功能,并在测试后使用DatabaseCleaner之类的东西重置数据库。
这样可行,但不幸的是截断或删除数据库内容比使用事务方法要慢一些 - 这就是为什么tranasactions首先是默认的。