Rails中的测试.似乎它在一次测试运行中删除了记录.想法



让我们看看下一个场景:

Scenario: Show welcome feed
  Given log me in
  When I'm on "profile" page
  Then Page should have content "You are welcome"

很简单。log me in步骤如何?

Given /^log me in$/ do
  @user = FactoryGirl.create :user, email: 'user@mail.ru', password: '12345678', username: '
  visit sign_in_path
  fill_in 'user_email', with: 'user@mail.ru'
  fill_in 'user_password', with: '12345678'
  click_on 'Enter'
end

没什么复杂的。但当我运行这个场景时,它无法让我登录,因为没有提供电子邮件的用户。哈哈什么?在我尝试创建并登录用户的其他场景中也会发生这种情况。

  • 这是一个全球性问题。我无法创建和测试任何记录
  • 它以前是有效的,场景和步骤没有任何变化
  • 它有效在开发生产环境中。所以我想这是环境问题

有什么想法吗?如何调试?

由于这一行,您的数据在每次测试后都会被删除

# spec/rails_helper.rb
config.use_transactional_fixtures = true

尝试将其更改为false,则您的数据将是持久的。有关更多信息,请参阅文档。

但是,始终保持数据的持久性是不好的。我建议您自己使用database_cleaner来管理数据。水豚/黄瓜有很好的记录。

如果没有您正在使用的配置,很难说准确,但由于您说它曾经工作过,我们将假设配置都是正确的。如果是这样的话,而你的"当我在…页面上"步骤实际上是访问一个页面,而不仅仅是检查当前路径,那么你最有可能经历的是,水豚的行动不能保证是同步的,即对水豚中任何行动的调用都可能在该行动触发的行动/副作用完成之前返回。在这种情况下,click_on 'Enter'会提交您的登录信息,但不会等待登录真正完成。如果When I'm on "profile" page在登录完全完成之前执行新的访问操作,则浏览器中不会设置cookie来识别其已登录。因此,尝试访问配置文件页面将如同用户未登录一样。您需要添加的是"登录"步骤中的最后一行,以确认登录已完成-类似

expect(page).to have_text('You are now logged in') # whatever text shows up when a user successfully logs in

expect(page).to have_selector('#user_menu') # selector for some element that is only on pages when a user is logged in

最新更新