在 Rails 3.1 中使用 Capybara、Rspec 和 Selenium 进行测试时登录失败
Posted
技术标签:
【中文标题】在 Rails 3.1 中使用 Capybara、Rspec 和 Selenium 进行测试时登录失败【英文标题】:Login Failure when Testing with Capybara, Rspec and Selenium in Rails 3.1 【发布时间】:2012-02-06 04:36:51 【问题描述】:我为我的 Rails 3.1 应用程序添加了一些确认对话框,并在此之前添加了相应的测试。按照Railscast #257的模型,我在测试中添加了':js => true',添加了database_cleaner并相应地修改了spec_helper.rb文件。
当我运行测试时,Firefox 启动,Capybara-Selenium 在字段中填写适当的用户名和密码,但登录失败(即“无效的用户名/密码”。)其他没有 ' :js => true' 并登录,仍然通过。
我希望将来在我的应用程序中添加更多 javascript,并且我正在避免使用会破解 Capybara 以使其工作的解决方案(例如,在所有对话框上单击“确定”。)
任何想法我可能会错过什么?失败了,关于如何调试这个问题的任何建议?
谢谢。
【问题讨论】:
【参考方案1】:您应该为您的 seleniumtests 设置 use_transactional_fixtures = false。 这可以通过
在 spec_helper.rb 中完成config.use_transactional_fixtures = false
所有测试。
或者对单个测试用例执行此操作:
describe 'testcase' , :type => :request do
self.use_transactional_fixtures = false
it 'your test', :js => :true do
testing...
end
end
发生这种情况是因为 selenium-tests 以不同的方式访问数据库。启用事务性固定装置后,selenium 将在空数据库上工作 -> 您的用户不存在并且您无法登录。
对于普通测试,您应该使用事务性固定装置,因为您的测试运行得更快。
【讨论】:
感谢您的回复。我在我的 spec_helper.rb 中禁用了事务性装置,但它不起作用。但是在特定的测试中这样做确实有效!当它单击按钮时,它让我登录并未能通过测试。但是出现了确认对话框,现在我只需要通过集成测试弄清楚如何单击它。再次感谢! 如果是共轨对话框可以试试:page.driver.browser.switch_to.alert.accept 如果我使用 mongoid 怎么办?我无法设置 use_transactional_fixtures = false 您描述单个测试用例解决方案的方式是错误的。use_transactional_fixtures
属性的值将被保存用于以下所有示例。因此,下面@onemanarmy 的解决方案适合这种情况。【参考方案2】:
根据Avdi Grimm's post(有详细说明):
宝石文件:
group :test do
gem 'database_cleaner'
end
spec_helper.rb:
config.use_transactional_fixtures = false
spec/support/database_cleaner.rb:
RSpec.configure do |config|
config.before(:suite) do
DatabaseCleaner.clean_with(:truncation)
end
config.before(:each) do
DatabaseCleaner.strategy = :transaction
end
config.before(:each, :js => true) do
DatabaseCleaner.strategy = :truncation
end
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
end
我禁用了事务性固定装置,但将 :js => true
块添加到 database_cleaner.rb
为我做到了。
【讨论】:
以上是关于在 Rails 3.1 中使用 Capybara、Rspec 和 Selenium 进行测试时登录失败的主要内容,如果未能解决你的问题,请参考以下文章
在 Rails 中使用 Capybara 和 Selenium 测试 Google 地图标记
在 Rails 中使用 RSpec 和 Capybara 时未定义的方法“访问”
在 Cucumber + Capybara + PhantomJS 在 Rails 中调试 jQuery Ajax
Rails - 安装 capybara-webkit 时遇到问题