2013-10-03 18 views
0

我有一個方法,返回給定的符號的價格,我正在爲該方法寫一個測試。Ruby Metaprogramming

這是我的測試

def setup 
    @asset = NetAssetValue.new 
end 

def test_retrieve_price_for_symbol_YHOO 
    assert_equal(33.987, @asset.retrieve_price_for_a_symbol('YHOO')) 
end 

def test_retrive_price_for_YHOO   
    def self.retrieve_price_for_a_symbol(symbol) 
    33.77 
    end 

    assert_equal(33.97, @asset.retrieve_price_for_a_symbol('YHOO')) 
end 

這是我的方法。

def retrieve_price_for_a_symbol(symbol) 
    symbol_price = { "YHOO" => 33.987, "UPS" => 35.345, "T" => 80.90 } 
    raise Exception if(symbol_price[symbol].nil?) 
    symbol_price[symbol] 
end 

我試圖通過編寫測試類相同的方法來嘲笑retrieve_price_for_a_symbol方法,但是當我把它稱爲,呼叫是發生在方法的主類不是在測試類。

如何從測試中將該方法添加到元類中,以及如何調用它?請幫忙。

+0

爲什麼要模擬您明確測試的方法?如果你嘲笑這個方法,你不會測試它的實現,這會導致測試過時。 – koffeinfrei

回答

2

而不是重新定義裏面的方法,你需要嘲笑它。

更換測試裏面的方法定義與

@asset.expects(:retrieve_price_for_a_symbol).with('YHOO').returns(33.97) 
+0

其說undefined方法預計 –

+0

你需要先安裝摩卡寶石。輸入終端'$ gem install mocha',然後在你的測試代碼'require'mocha/setup'' – prat0318

+0

也可以訪問[Mocha網站](http://gofreerange.com/mocha/docs/)瞭解更多信息。 – prat0318

2

假設你真的不想要嘲笑你正在測試的方法...

您當前定義的情況下你的模擬的測試類。您可以直接將模擬添加到@asset對象:

def test_retrive_price_for_YHOO 
    def @asset.retrieve_price_for_a_symbol(symbol) 
    33.77 
    end 

    assert_equal(33.97, @asset.retrieve_price_for_a_symbol('YHOO')) 
end 
+1

+1有勇氣閱讀OP –

相關問題