0

在我的ApplicationController,我公開可以由所有控制器共享的變量:填充實例變量定義在父控制器對於Rspec的測試

before_filter :expose_group 

protected 

    # Much simplified 
    def expose_group 
     @user_group = LearningGroup.find_by_uid(cookies[:user_group]) 
    end 

我使用RSpec的測試我的控制器,併爲其中的一些測試,我需要能夠在運行之前將@user_group設置爲已知值。如何在測試ApplicationController的子類時設置此變量?

注意:我需要一種方法來爲測試設置@user_group。使用存根控制expose_group的返回值不會有幫助,因爲@user_group仍然爲零。

回答

1

我會完全取消實例變量,並使用助手來代替。從開始,類似於GroupsHelper

module GroupsHelper 
    def user_group 
    @user_group ||= group_from_cookie 
    end 

    def user_group=(group) 
    @user_group = group 
    end 

    private 

    def group_from_cookie 
    group_uid = cookies[:user_group] 
    LearningGroup.find_by_uid group_uid unless group_uid.nil? 
    end 
end 

然後includeApplicationController

class ApplicationController < ActionController::Base 
    include GroupsHelper 
    # ... 
end 

現在,在spec/support爲您的測試定義一個助手。

include ApplicationHelper 

def join_group group_uid 
    # whatever preparation you may need to do as well 
    cookies[:user_group] = group_uid 
end 

測試可能類似於:

it 'does something awesome' do 
    join_group 'my awesome group id' 
    # ... 
    expect(your_subject).to be_awesome 
end 

當你運行你的測試,user_group將退還您已分配到cookie對象值確定的值。

這也有一個好處,就是隻需撥打join_group而不是在多處測試中將LearningGroup全部覆蓋。

0

你可以存根expose_group方法來返回你想要的。

在您的規格:

controller.stub(expose_group: 'what you need') 
+0

但它只是隱式返回任何東西。這不是我需要控制的'expose_group'的返回值,而是實例變量。 – Undistraction

+0

在這種情況下,@apneadiving的答案就是您所需要的。 – ventsislaf

1

我只是存根,如方法:

LearningGroup.should_receive(:find_by_uid).and_return known_value 
+0

這隻允許我控制'expose_group'的返回值,但我需要的是填充'@ leaning_group'實例變量的方法。 – Undistraction

+0

這個變量在哪裏定義? – apneadiving

+0

它在'expose_group'方法中定義在那裏。它在ApplicationController中被定義,並在我正在測試的子類中使用。 – Undistraction

相關問題