[英]Rails integration test with the devise gem
我想寫一個rails集成測試(使用ActionDispatch::IntegrationTest
)。 我正在使用設計驗證和測試模型的機械師。 我無法成功登錄。
這是一個簡單的例子:
class UserFlowsTest < ActionDispatch::IntegrationTest
setup do
User.make
end
test "sign in to the site"
# sign in
post_via_redirect 'users/sign_in', :email => 'foo@bar.com', :password => 'qwerty'
p flash
p User.all
end
這是調試輸出:
Loaded suite test/integration/user_flows_test
Started
{:alert=>"Invalid email or password."}
[#<User id: 980190962, email: "", encrypted_password: "", password_salt: "", reset_password_token: nil, remember_token: nil, remember_created_at: nil, sign_in_count: 0, current_sign_in_at: nil, last_sign_in_at: nil, current_sign_in_ip: nil, last_sign_in_ip: nil, created_at: "2010-11-27 16:44:10", updated_at: "2010-11-27 16:44:10">, #<User id: 980190963, email: "foo@bar.com", encrypted_password: "$2a$10$vYSpjIfAd.Irl6eFvhJL0uAwp4qniv5gVl4O.Hnw/BUR...", password_salt: "$2a$10$vYSpjIfAd.Irl6eFvhJL0u", reset_password_token: nil, remember_token: nil, remember_created_at: nil, sign_in_count: 0, current_sign_in_at: nil, last_sign_in_at: nil, current_sign_in_ip: nil, last_sign_in_ip: nil, created_at: "2010-11-27 17:09:13", updated_at: "2010-11-27 17:09:13">]
"/unauthenticated"
F
這是我的blueprints.rb:
require 'machinist/active_record'
require 'sham'
User.blueprint do
email {"foo@bar.com"}
password {"qwerty"}
end
它不起作用的原因是設計創建表單字段名稱為
'user[email]'
'user[password]'
和post_via_redirect期望這些名稱作為參數。 因此,以下聲明將成功登錄。
post_via_redirect 'users/sign_in', 'user[email]' => 'foo@bar.com', 'user[password]' => 'qwerty'
首先,通過設計,您可能必須“確認”用戶。
你可以這樣做:
user = User.make!
user.confirmed_at = Time.now
user.save!
這是一個沒有Machinist的例子(但你必須用上面的部分替換用戶創建代碼部分):
進入test_integration_helper:
require "test_helper"
require "capybara/rails"
module ActionController
class IntegrationTest
include Capybara
def sign_in_as(user, password)
user = User.create(:password => password, :password_confirmation => password, :email => user)
user.confirmed_at = Time.now
user.save!
visit '/'
click_link_or_button('Log in')
fill_in 'Email', :with => user.email
fill_in 'Password', :with => password
click_link_or_button('Sign in')
user
end
def sign_out
click_link_or_button('Log Out')
end
end
end
進入你的integration_test:
require 'test_integration_helper'
class UsersIntegrationTest < ActionController::IntegrationTest
test "sign in and then sign out" do
#this helper method is into the test_integration_helper file
sign_in_as("lolz@gmail.com", "monkey")
assert page.has_content?('Signed in successfully'), "Signed in successfully"
sign_out
assert page.has_content?('Signed out successfully'), "Signed out successfully"
end
end
我沒有在Devise的書中進行樣本集成測試,但我認為如果安裝了Webrat / Capybara,Cucumber章節中步驟定義中的代碼也會起作用:
@user = User.create!(:email => "email@email.com",
:password => "password",
:password_confirmation => "password")
visit "login"
fill_in("user_email", :with => @user.email)
fill_in("user_password", :with => "password")
click_button("Sign In")
如果其他人有類似的問題......
我處於類似的情況(從Authlogic遷移),並有這個完全相同的問題。 問題出在devise.rb初始化程序中。 默認情況下,它會將您的測試環境設置為在加密/解密密碼期間僅使用1次拉伸。 老實說,我不知道是什么延伸,但是對於Devise使用舊的Authlogic加密密碼,延伸必須是20.因為我試圖在我的測試中簽署一個最初由Authlogic加密密碼的用戶,設計也需要在測試中使用20個延伸。 我更改了如下配置:
# Limiting the stretches to just one in testing will increase the performance of
# your test suite dramatically. However, it is STRONGLY RECOMMENDED to not use
# a value less than 10 in other environments.
- config.stretches = Rails.env.test? ? 1 : 20
+ config.stretches = 20
由於您使用的是ActionDispatch::IntegrationTest
,因此您可以包含Devise::Test::IntegrationHelpers
模塊並使用sign_in
方法(您可以將用戶傳遞給它):
class UserFlowsTest < ActionDispatch::IntegrationTest
include Devise::Test::IntegrationHelpers
test "sign in to the site" do
sign_in users(:one)
end
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.