2012-06-03 28 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 
相关问题