Rspec匹配器测试一个方法在每个块中调用另一个方法



我试图测试一个ruby方法从它内部调用另一个方法,在每个块

示例类

class A
def foo
return 'foo'
end
end
class B
def initialize
@array_of_class_a_instances = []
end
def bar
@array_of_class_a_instances.each do |element|
element.foo
end
end
end

我想为B类中的bar方法编写一个单元测试,以验证foo方法被调用的次数是否与@array_of_class_a_instances的长度相同。如果我们说数组有4个元素,我想测试foo方法是否被调用了4次。我下面有一个测试,但它使用了多个expect语句。有没有一些语法可以只用一个来写?

describe B do
describe '#bar' do
# ommitted for brevity
small_b = B.new
it 'calls the foo method for each element in the array' do
expect(small_b.array_of_class_a_instances[0]).to receive(:foo).exactly(1).time
expect(small_b.array_of_class_a_instances[1]).to receive(:foo).exactly(1).time
expect(small_b.array_of_class_a_instances[2]).to receive(:foo).exactly(1).time
expect(small_b.array_of_class_a_instances[3]).to receive(:foo).exactly(1).time
small_b.bar
end
end
end

您也可以在测试中使用each:

small_b.array_of_class_a_instances.each do |instance|
expect(instance).to receive(:foo).exactly(1).time
end

还可以使用all匹配器一次检查数组的所有元素。

expect(small_b.array_of_class_a_instances).to all(receive(:foo).exactly(1).time)

最新更新