2012-08-14 49 views
1

我通过Cucumber使用Capybara来测试Rails应用程序。在黄瓜测试中调用@javascript之后丢失种子数据

Rails应用程序在DB/seeds.rb,其中规定了授权角色和默认用户帐户一些种子数据,我已经添加了一个test_seed.rake文件运行后rake db:test:prepare种子测试数据库,因为rake db:seed不会为测试数据库生成种子。

当我使用Capybara运行Cucumber功能时,这个种子数据是独立的,并且在测试每个功能时所做的任何更改都会回滚。但是,如果我尝试测试基于AJAX的功能,将@javascript放在测试前面,Selenium将运行它,一旦测试完成,种子数据就会被擦除。这意味着随后的基于授权的测试将失败,直到rake db:test:prepare再次运行,因为在创建用户帐户时无法找到role_id。

硒为什么这样做?更重要的是,我怎样才能阻止它?我知道我可以在每次测试之前使用Cucumber钩子加载数据,但是这些数据也需要在基于RSpec的单元测试之前加载,并且还需要加载到开发和生产数据库中。使用内置的种子机制似乎更加干燥。在任何情况下,数据库不应该回不同,只是因为硒得到调用轧)

编辑:!我使用database_cleaner与:transaction策略。 的文档提到了database_cleaner,但似乎只是沿着与使用:truncation的方式进行交谈,以使其他所有工作与Capybara在调用外部浏览器时执行的操作相同。我没有尝试过那个页面上的补丁,因为我不喜欢“奇怪的失败” - 有没有更清晰的方式?我开始认为去除测试,只是目测AJAX的东西将是最快,最简单的方法...

回答

0

我最终改变了黄瓜和RSpec的DatabaseCleaner.strategy为:truncation,并转移到SeedFu种子数据库。

黄瓜,将它添加到env.rb

Before do 
    SeedFu.quiet = true 
    SeedFu.seed 
end 

(记得要改变DatabaseCleaner.strategy!)

对于RSpec的,将它添加到spec_helper.rb

config.before(:suite) do 
    DatabaseCleaner.strategy = :transaction 
    DatabaseCleaner.clean_with(:truncation) 
end 

config.before(:each) do 
    DatabaseCleaner.start 
    SeedFu.quiet = true 
    SeedFu.seed 
end 

config.after(:each) do 
    DatabaseCleaner.clean 
end 

可悲的是,这使得全部测试运行速度稍慢,因为之前数据库只播种一次然后回滚,而不是每次播种。即使在种子文件中只有五个角色,它也是显而易见的。