Rspec没有创建可从poltergeist访问的数据库记录

时间:2014-07-24 11:53:28

标签: ruby-on-rails rspec poltergeist

我很难让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正在访问的环境中进行设置。

我似乎无法理解为什么。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:4)

有可能,您正在使用rspec中的“事务夹具”。这意味着每个测试都在数据库事务中运行,该事务在测试结束时回滚,以便每个测试都有一个干净的数据库。

其他线程/程序可以查看交易中发生的事情。 Poltergeist在单独的线程中运行服务器,这意味着它无法在rspec中看到任何写入数据库的内容(尽管可以直接从rspec代码访问)。

a description of this phenomenon on the capybara homepage。解决方案是在rspec-rails中禁用事务功能,并在测试后使用DatabaseCleaner之类的东西重置数据库。

这样可行,但不幸的是截断或删除数据库内容比使用事务方法要慢一些 - 这就是为什么tranasactions首先是默认的。