4

您好我最近繼承了一個項目,其中前開發人員不熟悉rails,並決定將許多重要的邏輯放入視圖助手中。如何將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 

要求聲明發現session_helper.rb沒問題,但沒有Rails的魔法,它不能以相同的方式訪問AppsControllerTest

我該如何欺騙這個瘋狂的設置來測試?

+2

在AppsControllerTest類中使用'SessionsHelper'並沒有幫助?如果您要積極開發此應用程序,我強烈建議您重新編寫由他們編寫的代碼,這沒有意義,您將節省時間。這聽起來像你只是想讓它繼續運行,並沒有時間去投資。 – Jeremy 2010-11-12 01:07:37

+0

所以看起來像助手正在被包含,因爲應用程序控制器在user_helper中調用一個方法,然後在sessions_helper中觸發一個錯誤。所以它好像被包括在內但不能與對方交談.z – kevzettler 2010-11-12 21:38:58

回答

1

我發現的唯一解決方案是重新考慮因素並使用合適的認證插件

+1

Devise爲我工作。 – 2013-05-28 19:08:49

1

爲什麼要重新考慮?在測試中,您可以非常輕鬆地包含項目中的助手。我做了以下這樣做。

require_relative '../../app/helpers/import_helper' 
-1

爲了能夠在測試中使用的設計,你應該添加

include Devise::TestHelpers 

每個ActionController::TestCase實例。然後在setup方法你做

sign_in users(:one) 

,而不是

current_user = users(:one) 

您的所有功能測試應該可以正常工作,然後。

+0

原始問題說設計沒有被使用。 – kevzettler 2013-11-16 22:27:26

+0

因爲常見的'current_user'變量,我假設你在哪裏使用Devise。順便說一句,你從來沒有說過你*不*使用Devise。很抱歉對於這個誤會。 – marzapower 2013-11-17 11:13:53

1

如果你想測試助手,你可以在這裏效仿的榜樣:

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

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

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

這是個人的方法的單元測試。我認爲,如果你想在一個較高的水平測試,並且您將使用多個控制器瓦特/重定向,你應該使用一個集成測試:

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