2017-02-24 42 views
0

怎樣一個模擬的是位於引用的文件通過紅寶石RSpec的嘲諷實用方法

require 'myfile.rb' 

該文件的內容的實用方法是像這樣。

public 
def my_method_name(arg1, arg2, arg3) 
{ 
    .... 
} 

目前,我有這樣的:

double("mydouble", "my_method_name" => somehash) 

我那麼單元測試類我測試,它調用這個方法,但是這似乎並沒有在所有嘲笑的方法。 所有幫助表示讚賞

基本上,我想模擬的方法做一些網絡查詢。我只想說:任何時候調用這個方法,都會返回這個散列。這種方法不是類的一部分(或者我相信)。

+0

你想爲一個類的所有實例存根方法嗎?你能舉出一個你預期會發生什麼樣的代碼嗎? – ndn

+0

上面編輯的問題。我想模擬的方法在我正在測試的類中使用。不知道我的問題是否清楚。 – user98651

回答

1

在Ruby中,所有方法都與某些東西(模塊或類)相關聯。您在頂層定義的方法實際上成爲Kernel的私有方法。


x = double("mydouble", "my_method_name" => somehash) 

不存根方法my_method_name。它創建一個雙重(單獨的對象)。如果你在它調用#my_method_name,它將與somehash迴應:

x.my_method_name # => somehash 

找到方法被調用的對象。如果它很容易被替換,並且沒有那麼多的功能,那麼你可以在它的位置傳遞這個double。如果不是的話,你可以通過做存根對象的方法:

said_object.stub(my_method_name: somehash) 

如果要存根它一類的所有實例,你可以這樣做:

TheObjectsClass.any_instance.stub(my_method_name: somehash) 

聲明:這個話題有點複雜,有待辯論。不要認爲這是一個很好的測試練習,它只是旨在幫助您瞭解如何使用rspec。


你說這與網絡有關。您可以考慮使用VCR來模擬實際請求。

0

由於要測試的類上調用此方法的人,你應該在同一類

allow(<your_class_instance>).to receive(:my_method_name).and_return(<>) 

我假定這方法磕碰的方法是一個實例方法。如果使用類方法,則必須在類級別存根