2010-11-10 61 views
3

我想知道你將如何解決這個任務由控制器類

包括當如何來測試模塊增加的before_filter方法你想下面的代碼

class AController < ActionController::Base 
    before_filter :the_method 

protected 
    def the_method 
    end 
end 

重構到

class AController < ActionController::Base 
    include TheModule 
end 

,但因爲你是BDD愛好者,你必須寫規範第一

describe TheModule do 
    context "when included" do 
    it "adds #the_method as a before_filter" do 

     # insert your code here 

    end 
    end 
end 

換句話說,問題是: 如何編寫一個規範,用於檢查TheModel#the_method是否作爲before_filter添加到類(可能是控制器類)中時添加的。

回答

1

我做了這樣的:

describe TheModule do 
    context "when included" do 
    it "adds #the_method as a before_filter" do 
     instance = Object.new 
     instance.class_eval do |klass| 
     expects(:before_filter).with(:expensive_method) 
     include TheModule 
     end 
    end 
    end 
end 

因爲我們不需要測試前過濾器的行爲。我們可以測試它是否正確執行。

+0

比我的hacky解決方案簡單得多:) – 2010-11-17 08:52:34

+0

對象實例不響應#class_eval方法。 [14] pry(main)> instance.class_eval do [14] pry(main)* Include Foo [14] pry(main)* end NoMethodError:未定義方法'class_eval'for# from (pry):30:在'evaluate_ruby'中 你可能想要使用Class.new然後newinstance.send(:include,ModuleName) – AfDev 2015-09-09 15:24:32

1

那麼你可以檢查回調調用方法的存在。

@model.methods.include?('before_callback_method_name') 

然而,這只是檢查回調運行方法是本,而不是它的一個特定類型。

我找不到獲取模型回調列表的方法。

唯一的選擇是測試模型是否按照它的假設存在回調,即如果回調在更新時反轉字符串,檢查字符串在更新時反轉。

*編輯*

可以檢索回調的列表,像這樣:

@u._validate_callbacks 

它返回一個回調鏈,其中包括有姓名和重要的類型。

>> u._validate_callbacks.first.class 
=> ActiveSupport::Callbacks::Callback 
>> u._validate_callbacks.first.kind 
=> :before 
>> u._validate_callbacks.first.filter 
=> :validate_associated_records_for_sites 

應該能夠精確地測試,如果它現在加載。

+0

應該可以工作,我唯一不喜歡的地方是它增加了對內部ActiveSupport行爲的依賴,這些行爲可以改變並且已經被測試過。 – mehowte 2010-11-11 08:10:28