我很难让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”,然后尝试查看“Axel”的runner profile页面。
在调试器中断的地方,我可以看到已经创建了@runner_1 (Axel):
Runner.friendly.find('axel')
>> #<Runner id: 2, email: "axel.manzano@hotmail.fr",........>然而,当试图访问'/runners/axel‘时,Poltergeist报告说:
ActiveRecord::RecordNotFound这不是路线的问题,或者类似的问题。
实际上,在深入研究了这个bug之后,似乎在Poltergeist正在访问的环境中并没有真正设置在测试文件中创建的任何内容。
我似乎不明白为什么。任何帮助都非常感谢。
发布于 2014-07-24 15:59:49
很有可能,您正在rspec中使用“事务性固定装置”。这意味着每个测试都在数据库事务中运行,该事务在测试结束时回滚,因此每个测试都有一个干净的数据库。
其他线程/程序可以而不是来查看事务中正在发生的事情。Poltergeist在单独的线程中运行服务器,这意味着它看不到任何写入rspec数据库的内容(尽管它可以直接从rspec代码中访问)。
有对这种现象的描述在水豚的主页上。解决方案是禁用rspec中的事务特性,并在测试后使用类似于DatabaseCleaner的方法重置数据库。
这是可行的,但不幸的是,截断或删除数据库内容要比使用事务性方法慢一些--这就是为什么tranasactions最初是默认的。
https://stackoverflow.com/questions/24932947
复制相似问题