我有以下测试:
describe "Exporter#get_method" do
before(:each) do
exporter.should_receive(:get_method).at_least(:once).and_call_original
end
it "should get the next terminal value" do
exporter.send(:get_method).should == :split
end
it "should call descend if the current value is a hash" do
exporter.should_receive(:descend).once
2.times { exporter.send(:get_method) }
end
it "should call ascend if at the end of an array and there is a prologue" do
exporter.should_receive(:ascend).once
3.times { exporter.send(:get_method) }
end
end
我可以通过一些binding.pry调用来验证是否正在调用上升和下降。然而,RSpec没有看到它。我哪里错了。我想确保被测试的方法在正确的情况下调用其他方法。还有另一种方法吗?
答案 0 :(得分:0)
我倾向于永远不会在before
块中提出期望。我看待它的方式,before
块实际上只是用于设置您正在测试的情况,而不是为了消除期望。将exporter.should_receive(:get_method).at_least(:once).and_call_original
移出before
块并将其分发到3个it
块(在三种情况下根据需要进行编辑)时会发生什么?它可能与其他should_receive
电话冲突。
此外,如果您拨打exporter.get_method
而不是exporter.send(:get_method)
,它会有效吗?通常,RSpec旨在测试行为,而不是实现,如果get_method
是私有方法,那么直接测试它并没有任何意义。相反,您可能想要做的是为使用该私有方法的方法编写测试。否则,如果它不是私有方法,为什么使用:send
?