RSpec消息期望未得到满足但方法被调用

时间:2013-01-06 21:28:39

标签: rspec mocking

我有以下测试:

  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没有看到它。我哪里错了。我想确保被测试的方法在正确的情况下调用其他方法。还有另一种方法吗?

1 个答案:

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