Rails 教程 - 错误消息:预期响应为 <redirect>,但为 <200>
Rails Tutorial - ERROR MESSAGE: expected response to be a <redirect>, but was <200>
"Listing 8.20: A test for user logging in with valid information" 中的测试给我一个持续的错误消息:
FAIL["test_login_with_valid_information", UsersLoginTest, 1.051300315]
test_login_with_valid_information#UsersLoginTest (1.05s)
Expected response to be a <redirect>, but was <200>
test/integration/users_login_test.rb:22:in `block in <class:UsersLoginTest>'
测试是:
19 test "login with valid information" do
20 get login_path
21 post login_path, session: { email: @user.email, password: 'password' }
22 assert_redirected_to @user
23 follow_redirect!
24 assert_template 'users/show'
25 ....
会话控制器是我想象的导致此错误消息的原因
def create
user = User.find_by(email: params[:session][:email].downcase)
if user && user.authenticate(params[:session][:password])
log_in user
redirect_to user # What I want to happen
else
flash.now[:danger] = 'Invalid email/password combination'
render 'new' # What is happening
end
end
如果用户通过身份验证,它应该重定向到用户个人资料页面
否则登录表单将 render
所以我认为问题是我的测试用户没有经过身份验证。当我在站点上手动登录时,应用程序登录和重定向功能正常。
test/fixtures/users.yml有这个传密码'password'
password_digest: <%= User.digest('password') %>
并且用户模型有这个来消化密码 'password'
def User.digest(string)
cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST :
BCrypt::Engine.cost
BCrypt::Password.create(string, cost: cost)
end
问题出在哪里?以及如何进行另一项测试以说明此测试失败的原因?
睡了一夜好觉后,我意识到这可能是由于数据库错误。瞧,我的数据库有一封大写的电子邮件,而我的控制器提交了一封小写的电子邮件。
已解决。
如果我没看错的话,我有一个类似的(相同的)问题,为了未来浏览器的清晰起见,我将添加以下内容:正如 Shonin 所指出的,这个问题与控制器采用 downcase 有关电子邮件地址,显然在 users.yml 代码
中
michael:
name: Michael Example
email: Michael@example.com
password_digest: <%= User.digest('password') %>
不会通过
michael:
name: Michael Example
email: michael@example.com
password_digest: <%= User.digest('password') %>
会过去的。
"Listing 8.20: A test for user logging in with valid information" 中的测试给我一个持续的错误消息:
FAIL["test_login_with_valid_information", UsersLoginTest, 1.051300315]
test_login_with_valid_information#UsersLoginTest (1.05s)
Expected response to be a <redirect>, but was <200>
test/integration/users_login_test.rb:22:in `block in <class:UsersLoginTest>'
测试是:
19 test "login with valid information" do
20 get login_path
21 post login_path, session: { email: @user.email, password: 'password' }
22 assert_redirected_to @user
23 follow_redirect!
24 assert_template 'users/show'
25 ....
会话控制器是我想象的导致此错误消息的原因
def create
user = User.find_by(email: params[:session][:email].downcase)
if user && user.authenticate(params[:session][:password])
log_in user
redirect_to user # What I want to happen
else
flash.now[:danger] = 'Invalid email/password combination'
render 'new' # What is happening
end
end
如果用户通过身份验证,它应该重定向到用户个人资料页面 否则登录表单将 render
所以我认为问题是我的测试用户没有经过身份验证。当我在站点上手动登录时,应用程序登录和重定向功能正常。
test/fixtures/users.yml有这个传密码'password'
password_digest: <%= User.digest('password') %>
并且用户模型有这个来消化密码 'password'
def User.digest(string)
cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST :
BCrypt::Engine.cost
BCrypt::Password.create(string, cost: cost)
end
问题出在哪里?以及如何进行另一项测试以说明此测试失败的原因?
睡了一夜好觉后,我意识到这可能是由于数据库错误。瞧,我的数据库有一封大写的电子邮件,而我的控制器提交了一封小写的电子邮件。
已解决。
如果我没看错的话,我有一个类似的(相同的)问题,为了未来浏览器的清晰起见,我将添加以下内容:正如 Shonin 所指出的,这个问题与控制器采用 downcase 有关电子邮件地址,显然在 users.yml 代码
中michael:
name: Michael Example
email: Michael@example.com
password_digest: <%= User.digest('password') %>
不会通过
michael:
name: Michael Example
email: michael@example.com
password_digest: <%= User.digest('password') %>
会过去的。