2012-06-03 61 views
22

我想測試一個函數是否用minitest Ruby正確調用其他函數,但是我找不到合適的assert來測試doc如何使用Ruby minitest框架調用某些方法?

的源代碼
class SomeClass 
    def invoke_function(name) 
    name == "right" ? right() : wrong() 
    end 

    def right 
    #... 
    end 

    def wrong 
    #... 
    end 
end 
測試代碼:
describe SomeClass do 
    it "should invoke right function" do 
    # assert right() is called 
    end 

    it "should invoke other function" do 
    # assert wrong() is called 
    end 
end 

回答

21

隨着MINITEST使用expect方法設置的方法的期望的模擬對象上調用像這樣

obj = MiniTest::Mock.new 
obj.expect :right 

如果你想設置參數和返回值的期望,那麼:

obj.expect :right, return_value, parameters 

而對於像這樣的具體對象:

obj = SomeClass.new 
assert_send([obj, :right, *parameters]) 
+2

對於具體對象的版本,有'must_send'使用'MINITEST/spec' – Frost

+0

告訴我時如果我錯過了一些東西,但是我認爲下面的@ jing-li的回答是正確的,在這裏提到'assert_send'不適合。 OP要測試調用'invoke_function'時調用'right'。此外,需要'obj.verify'來確保在這個答案的第一部分的模擬對象上調用'right'。對於閱讀此內容的任何人,請確保您的測試失敗後再通過測試。 – monozok

+0

我認爲使用assert_send不是一個安全的選擇。根據文檔:http://ruby-doc.org/stdlib-2.0.0/libdoc/minitest/rdoc/MiniTest/Assertions.html#method-i-assert_send –

9

MINITEST具有特殊.expect :call檢查,如果一些方法被調用。

describe SomeClass do 
    it "should invoke right function" do 
    mocked_method = MiniTest::Mock.new 
    mocked_method.expect :call, return_value, [] 
    some_instance = SomeClass.new 
    some_instance.stub :right, mocked_method do 
     some_instance.invoke_function("right") 
    end 
    mocked_method.verify 
    end 
end 

不幸的是,這個功能沒有很好的記錄。我從這裏找到它:https://github.com/seattlerb/minitest/issues/216

0

根據給出的示例,沒有其他委託類,並且您想確保方法從相同的類中正確調用。然後下面的代碼片段應該工作:

class SomeTest < Minitest::Test 
    def setup 
    @obj = SomeClass.new 
    end 

    def test_right_method_is_called 
    @obj.stub :right, true do 
     @obj.stub :wrong, false do 
     assert(@obj.invoke_function('right')) 
     end 
    end 
    end 

    def test_wrong_method_is_called 
    @obj.stub :right, false do 
     @obj.stub :wrong, true do 
     assert(@obj.invoke_function('other')) 
     end 
    end 
    end 
end 

的想法是通過返回一個簡單的真正值存根[method_expect_to_be_called],並在枝節塊斷言它確實被調用和返回真正值。存根其他意想不到的方法只是爲了確保它不被調用。

注意:assert_send將無法正常工作。請參閱official doc

事實上,下面的語句將通過,但並不意味着它按預期工作:

assert_send([obj, :invoke_function, 'right']) 
# it's just calling invoke_function method, but not verifying any method is being called 
相關問題