2013-01-16 20 views
8

我使用的RSpec 1.3.2測試控制器動作,看起來像這樣的實例變量:存根內部控制

def action_foo 
    ... 
    @bar.can_do_something? 
    ... 
end 

我試圖存根@bar(假設它是Bar類的一個實例)實例變量,但我無法。我認爲如果我有權訪問any_instance,那麼我可以做Bar.any_instance.stub(:can_do_something?),但這在我使用的rspec版本中不可用。

是否有另一種方式訪問​​和存根@bar?以下的無工作:

@bar.stub(:can_do_something?) 
controller.instance_variable_get("@bar").stub(:can_do_something?) 
controller.stub_chain(:bar, :can_do_something?) 
Bar.new.stub(:can_do_something?) 

編輯:

@barbefore_filter分配。像@bar = Bar.find(n)

+0

在哪裏/如何'@ bar'實例? –

+0

'@ bar'被分配在'before_filter'中 – Dty

回答

3

根據記錄,這是一個有點清潔,我認爲:

bar = Bar.new # or use FactoryGirl to create a Bar factory 
bar.stub(:can_do_something?) { # return something } 
controller.instance_variable_set(:@bar, bar) 
1
Bar.any_instance.stub(:can_do_something?) 
+0

好吧,你怎麼得到@bar呢? – apneadiving

+0

'@ bar'是在'before_filter'中分配的 – Dty

+0

怎麼樣?一個數據庫查詢? – apneadiving

1

如果一切都失敗了,你可以做一些類似於any_instance.stub的東西。爲了記錄,這讓我感到骯髒。

Bar.class_eval do 
    alias :original_can_do_something? :can_do_something? 

    def can_do_something? # "stub" method 
    # Return whatever you need here 
    end 
end 

# Run your test 

Bar.class_eval do 
    alias :can_do_something? :original_can_do_something? # "unstub" the method 
end 
+0

我不會用這個解決方案,但接受你的答案,因爲它是唯一一個回答我的問題 – Dty