这个 rspec expect 块在做什么?

What is this rspec expect block doing?

我正在尝试找出一些 Rspec 代码

我们有双人间:

let(:store_service) { double(StoreService) }

然后在 it 块内:

expect(store_service).to receive(:run) do
  { error: 'The storeman did not sign up for this.' }
end

这个块在这种情况下做什么?

有时 allowexpect 关键字会混淆。 rubocop-rspec 可以帮助您避免这种情况。

有关如何引发和预期错误的详细信息,请参阅 raising-an-error and raise-error-matcher 文档。

示例单元测试可能如下所示:

describe StoreService do
  context "when storeman did not sign up" do
    subject { StoreService.new(sign_up: nil).run }

    it "raises an error" do
      expect { subject.run }.to raise_error("The storeman did not sign up for this.")
    end
  end
end

集成测试示例可能如下所示:

class Caller
  def run
    store_service = build_store_service
    store_service.run
  rescue RuntimeError => e
    handle_error(e)
  end

  def handle_error(e)
     ...
  end

  def build_store_service
    ...
  end
end

describe Caller do
  describe "run" do
    context "when storeman did not sign up" do
      subject(:caller) { described_class.new }

      let(:store_service) { double(StoreService) }
      let(:error_msg) { "The storeman did not sign up for this." }

      before do
        allow(store_service).to receive(:run).and_raise(error_msg)
        allow_any_instance_of(Caller).to receive(:build_store_service).and_return(store_service)
      end

      it "calls run" do
        expect(caller).to receive(:handle_error)
        caller.run
      end
    end
  end
end