在 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 时遇到问题

Rails - 失去与集成测试和 Capybara 的会话 - CSRF 相关?

在 Rails 中,我应该在 capybara(或集成)测试中包含用户输入表单错误流吗?