2013-07-17 88 views
0

我在RPEC試圖寫測試用例一類像這樣模擬類的本地方法

class ABC 
    def method_1(arg) 
     #does something and return a value based on arg 
    end 

    def initialize 
     @service = method_1(arg) 
    end 

    def getSomething_1 
     return @service.get_seomthing_1 
    end 

    def getSomething_2 
     return @service.get_seomthing_2 
    end 
end 

現在我想發起@Service實例變量用嘲笑的對象,這樣我可以使用嘲笑對象返回值,我可以驗證我的單元測試。

我試圖做類似

describe ABC do 
    before(:each) do 
     myObject = double() 
     myObject.stub(:get_something_1).and_return("SomeValue") 
     ABC.any_instance.stub(:method_1).and_return(myObject) 
    end 

    it "Checks the correctness of getSomething_1 method of class ABC" do 
     @abc = ABC.new 
     @abc.getSomething_1.should eql("SomeValue") 
    end 
end 

現在,當我試圖運行測試@Service是沒有得到與我想它的對象初始化。 看起來像method_1不會被定義的行爲嘲笑。 有人可以幫助我如何分配@service與我的嘲弄的對象。

回答

0

你有被你刪:method_1這個問題,它允許你控制什麼回報,但在短路其行爲。不幸的是,什麼method_1返回是無關緊要的,它是什麼確實-指定@service - 這很有趣。

沒有看到您的班級的實際界面和設計,我不能建議對該分數進行改進,但您至少可以通過用一個實例變量(即。@service.some_method)替換對某個實例變量的引用來正確工作attr_reader:

class ABC 
    attr_reader :service 

    # ... 

    def getSomething_1 
    return service.get_seomthing_1 
    end 
end 

,然後在規格:

describe ABC 
    # .. 

    before do 
    ABC.any_instance(:service).and_return(myObject) 
    # ... 
    end 

    it "Checks the correctness of getSomething_1 method of class ABC" do 
    @abc = ABC.new("xyz") 
    @abc.getSomething_1.should eql("SomeValue") 
    end 
end 

在這種情況下,ABC任何實例將返回你的模擬時,其屬性service被調用,允許getSomething_1正確引用你的模擬。

+0

我的方法_1做的是它啓動服務客戶端和service.get_seomthing_1是服務的API調用,所以我試圖切斷網絡依賴關係並使用我的模擬對象啓動服務。 – manyu

+0

您的attr_reader工作方式,我也想通過編寫一個函數來設置我的服務變量類似的方法。 但我很困惑,爲什麼存根服務工作,因爲它也會表現爲類中的本地函數調用。 – manyu

0

你真的很接近,但它看起來像不正確的存根:method_1對ABC的一個實例。你需要做的是這樣的:

before(:each) do 
    myObject = double(get_something_1: "SomeValue") 
    ABC.any_instance().should_receive(:method_1).and_return(myObject) 
end 
+0

我認爲你在回覆中所做的只是另一種存根方式,與我的做法沒有什麼不同。 – manyu

+0

@manyu我測試了我的例子,它的工作原理。我不確定你的問題在哪裏。 –

+0

你能告訴我如何定義模擬像你這樣的定義,即雙(get_something_1: 「someValue中」) 是 myObject的雙=() myObject.stub不同(:get_something_1).and_return( 「someValue中」) – manyu