没有存根的断言方法调用?

时间:2012-02-17 20:43:31

标签: ruby unit-testing mocking mocha

我想声明一个特定的方法被调用,但我不想模拟/存根方法 - 我也希望在测试中包含该代码。

例如,在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

有没有人有建议(或更好的方法)?我的实际代码要复杂得多,所以请不要将示例的简单性考虑在内。

2 个答案:

答案 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

请注意,我还没有测试过这段代码!