Ruby on rails - 使用Cucumber,有没有办法在没有界面的情况下登录用户



我的绝大多数黄瓜功能都需要用户登录。 但是,我实际上并不需要为每个测试测试登录功能。 我目前正在使用 Devise 进行身份验证。

我正在寻找一种使用 devise 登录用户的方法,而无需填写登录表单。 有没有办法这样做? 我宁愿不必在每次测试中使用登录操作。

不,没有办法。在文档中,关于sign_in @usersign_out @user帮助程序方法,它说:

这些帮助程序不适用于由 Capybara 或 Webrat 驱动的集成测试。它们仅用于功能测试。相反,请填写表单或显式设置会话中的用户

正如你自己所说,用before :each块做可能是最干净的。我喜欢像下面这样构建它:

context "login necessary" do
  # Before block
  before do
    visit new_user_session_path
    fill_in "Email", with: "test@test.com"
    fill_in "Password", with: "password"
    click_button "Login"
    assert_contain "You logged in successfully."
  end
  # Actual tests that require the user to be logged in
  it "does everything correctly" do
    # ...
  end
end
context "login not necessary" do
  it "does stuff" do
    # code
  end
end

我发现这非常有用,因为如果我更改身份验证规则(即用户是否必须登录特定路径),我可以只进行整个测试并将其移动到另一个描述块中,而无需更改更多代码。

通常,您应该始终通过界面进行测试。但我认为这是一个可以接受的例外。

我正在将 devise 与水豚一起使用 rspec,但它也应该适合您。

在助手中,我有这个:

module LoginHelper
  def login_as(user)
    super(user, :scope => :user, :run_callbacks => false)
  end
end
RSpec.configure do |config|
  config.include Warden::Test::Helpers, :type => :feature
  config.include LoginHelper, :type => :feature
  config.before :each, :type => :feature do
    Warden.test_mode!
  end
  config.after :each, :type => :feature do
    Warden.test_reset!
  end
end

然后在功能中:

  background do
    login_as(user)
    visit root_path
  end

另请参阅:
如何在水豚测试中使用 Rspec 存根管理员/设计

相关内容

  • 没有找到相关文章