Rails单元测试assert_template失败

时间:2014-12-25 01:41:22

标签: ruby-on-rails unit-testing

我有以下测试: 测试/集成/ 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)

这可能是测试失败原因的一部分吗?为什么页面不呈现?

4 个答案:

答案 0 :(得分:4)

在像这样的集成测试中,get语句不遵循重定向。要关注重定向,请使用get_via_redirect。更多信息是here

答案 1 :(得分:2)

另一种解决方法是使用assert_redirected_to

答案 2 :(得分:1)

我使用了follow_redirect!强制测试重定向。然后我可以检查它是否使用assert_template重定向到正确的页面。

答案 3 :(得分:0)

我很快就参加了聚会,但SaulGoodman。我遇到了一个非常类似的问题,所以你的帖子很有用。我发现如果涉及重定向,assert_template方法不起作用。如果页面正在呈现,那么它才是唯一可靠的。我认为。也许我错了,但这是我慢慢接受的教训。希望你能解决这个问题。