我想声明一个特定的方法被调用,但我不想模拟/存根方法 - 我也希望在测试中包含该代码。
例如,在Ruby中,类似于:
def bar()
#stuff I want to test
end
def foo()
if condition
bar()
end
#more stuff I want to test
end
# The test:
foo()
assert_called :bar
有没有人有建议(或更好的方法)?我的实际代码要复杂得多,所以请不要将示例的简单性考虑在内。
答案 0 :(得分:0)
这是一个很好的方法,可以让它成为两个测试用例,一个会调用foo()
并检查是否调用bar()
而另一个是检查bar()
是否做得好。当您测试foo()
时,您应该知道应该返回bar()
。
答案 1 :(得分:0)
也许是这样的:
require 'set'
class Class
def instrument
self.instance_methods.each do |m|
old = method(m)
define_method(m) do |*a,&b|
@__called__ ||= Set.new
@__called__ << m
old.bind(self).call(*a,&b)
end
end
end
end
class Object
def assert_called(method)
if not (@__called__ && @__called__.include?(method))
# You will have to figure out how to make this equivalent to a failing
# assertion for your favorite test framework
raise "Assertion failed! #{method} has not been called"
end
end
end
然后在定义类之后,但在运行测试之前:
FooClass.instrument
请注意,我还没有测试过这段代码!