我的绝大多数黄瓜功能都需要用户登录。 但是,我实际上并不需要为每个测试测试登录功能。 我目前正在使用 Devise 进行身份验证。
我正在寻找一种使用 devise 登录用户的方法,而无需填写登录表单。 有没有办法这样做? 我宁愿不必在每次测试中使用登录操作。
不,没有办法。在文档中,关于sign_in @user
和sign_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 存根管理员/设计