【问题标题】:RSpec, checking that an instance received a method & argumentRSpec,检查实例是否收到了方法和参数
【发布时间】:2016-08-19 04:41:20
【问题描述】:

我有一堂课如下...

     class Sequencer

            def initialize(error_raiser: nil)
            @error_raiser = error_raiser || ErrorRaiser.new
            end

            def order(string)
            error_raiser.raise_error(string)
            end

            attr_reader :error_raiser

            end

如何在我的 sequencer_spec 文件中检查 @error_raiser 收到带有字符串的 raise_error?我尝试过使用这样的实例间谍......

  let(:error_raiser) { instance_spy("ErrorRaiser" }
  describe Sequencer do
    describe '.order' do
      it "passes the string to an error_raiser" do
        subject.order("a => b,")
        expect(error_raiser).to have_received(:raise_error).with("a => b")
      end
    end
  end

但是我得到以下错误...

 (InstanceDouble(ErrorRaiser) (anonymous)).raise_error("a => b")
 expected: 1 time with arguments: ("a => b")
 received: 0 times

【问题讨论】:

  • 对 subject.order 的调用中多余的逗号是故意的吗?

标签: ruby oop rspec mocking


【解决方案1】:

你应该告诉 rspec 你用let中定义的那个来替换它的error_raiser。

subject.stub(:error_raiser).and_return(error_raiser)

(取决于 rspec 版本)通常不需要进行实例 spy。以下应该工作

describe '.order' do
    it "passes the string to an error_raiser" do
        expect(subject.error_raiser).to receive(:raise_error).with("a => b")
        subject.order("a => b")
    end
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-12
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    • 2012-10-26
    • 1970-01-01
    • 2014-05-05
    • 1970-01-01
    相关资源
    最近更新 更多