如何将Rails助手导入功能测试

时间:2010-11-11 23:52:35

标签: ruby-on-rails unit-testing ruby-on-rails-3 functional-testing

您好我最近继承了一个项目,其中前开发人员不熟悉rails,并决定在视图助手中加入许多重要的逻辑。

class ApplicationController < ActionController::Base
  protect_from_forgery
  include SessionsHelper
  include BannersHelper
  include UsersHelper
  include EventsHelper
end

具体的会话管理。这是可以的,并与应用程序一起工作,但我在为此编写测试时遇到问题。

一个具体的例子。某些操作执行before_filter以查看current_user是否为管理员。此current_user通常由我们所有控制器中共享的sessions_helper方法设置 因此,为了正确测试我们的控制器,我需要能够使用这个current_user方法

我试过这个:

require 'test_helper'
require File.expand_path('../../../app/helpers/sessions_helper.rb', __FILE__)

class AppsControllerTest < ActionController::TestCase
  setup do
    @app = apps(:one)
    current_user = users(:one)
  end

  test "should create app" do
    assert_difference('App.count') do
      post :create, :app => @app.attributes
  end
end

require语句发现session_helper.rb没问题,但没有Rails魔法,它在AppsControllerTest

中的访问方式不同

如何欺骗这个疯狂的设置进行测试?

4 个答案:

答案 0 :(得分:1)

我找到的唯一解决方案是重新考虑并使用一个不错的auth插件

答案 1 :(得分:1)

为什么要重新考虑因素?您可以非常轻松地在测试中包含项目中的帮助程序。我做了以下这样做。

require_relative '../../app/helpers/import_helper'

答案 2 :(得分:1)

如果您想测试帮助者,可以按照以下示例进行操作:

http://guides.rubyonrails.org/testing.html#testing-helpers

class UserHelperTest < ActionView::TestCase
  include UserHelper       ########### <<<<<<<<<<<<<<<<<<<

  test "should return the user name" do
    # ...
  end
end

这适用于单个方法的单元测试。我认为,如果你想在更高级别进行测试,并且你将使用多个控制器w /重定向,你应该使用集成测试:

http://guides.rubyonrails.org/testing.html#integration-testing

举个例子:

require 'test_helper'
 
class UserFlowsTest < ActionDispatch::IntegrationTest
  fixtures :users
 
  test "login and browse site" do
    # login via https
    https!
    get "/login"
    assert_response :success
 
    post_via_redirect "/login", username: users(:david).username, password: users(:david).password
    assert_equal '/welcome', path
    assert_equal 'Welcome david!', flash[:notice]
 
    https!(false)
    get "/posts/all"
    assert_response :success
    assert assigns(:products)
  end
end

答案 3 :(得分:-1)

为了能够在测试中使用Devise,您应该添加

include Devise::TestHelpers

到每个ActionController::TestCase实例。然后使用setup方法

sign_in users(:one)

而不是

current_user = users(:one)

然后,所有功能测试都应该正常工作。