我有以下测试: 测试/集成/ authentication_test.rb:
require 'test_helper'
class AuthenticationTest < ActionDispatch::IntegrationTest
def setup
@admin = users(:barry) # grab user from fixtures
end
test "trying to view a user before logging in" do
get user_path(@admin)
assert_template 'sessions/new'
assert_not flash.empty?
assert_select "div#error_explanation"
assert_select "div.field_with_errors"
assert_select "a[href=?]", logout_path, count: 0
assert_not is_logged_in?
end
end
测试失败,出现以下错误:
FAIL["test_trying_to_view_a_user_before_logging_in", AuthenticationTest, 2.206536] test_trying_to_view_a_user_before_logging_in#AuthenticationTest (2.21s)
expecting <"sessions/new"> but rendering with <[]>
test/integration/authentication_test.rb:11:in `block in <class:AuthenticationTest>'
users_controller.rb的相关位:
class UsersController < ApplicationController
before_action :logged_in_user, only: [:index, :show, :edit, :update, :destroy]
def show
@user = User.find_by_callsign(params[:callsign])
@page_name = "user_page"
redirect_to root_url and return unless @user.activated
end
.
.
end
sessions_helper.rb:
def logged_in_user
unless logged_in?
store_location
flash[:danger] = "Please log in."
redirect_to login_url
end
end
def logged_in?
!current_user.nil?
end
在routes.rb中:
get 'login', to: 'sessions#new'
我不明白测试失败的原因。当我手动执行这些步骤时,一切正常。 assert_template是否存在已知问题?当我在测试中注释掉assert_template 'sessions/new'
时,它会通过。
编辑:
在log / test.log中:它确实重定向到正确的模板(重定向到http://www.example.com/dominos/newname)。但它没有任何“呈现”的信息。线。失败测试的最后几行是:
Redirected to http://www.example.com/dominos/newname
Completed 302 Found in 21ms (ActiveRecord: 2.5ms)
[1m[35m (0.4ms)[0m SELECT COUNT(*) FROM "personas"
[1m[36m (0.2ms)[0m [1mROLLBACK[0m
在涉及assert_template的成功测试的test.log文件中,有各种“渲染”文件。重定向后的行,例如:
Rendered personas/new.html.erb within layouts/application (2.0ms)
这可能是测试失败原因的一部分吗?为什么页面不呈现?
答案 0 :(得分:4)
在像这样的集成测试中,get
语句不遵循重定向。要关注重定向,请使用get_via_redirect
。更多信息是here。
答案 1 :(得分:2)
另一种解决方法是使用assert_redirected_to
答案 2 :(得分:1)
我使用了follow_redirect!强制测试重定向。然后我可以检查它是否使用assert_template重定向到正确的页面。
答案 3 :(得分:0)