ruby-on-rails 我们如何使用rspec测试交互组织者?

enyaitl3  于 2022-12-20  发布在  Ruby
关注(0)|答案(3)|浏览(106)

我想测试以下组织者交互器,调用2个指定的交互器,而不执行调用交互器(“SaveRecord,PushToService”)代码。

class Create
  include Interactor::Organizer

  organize SaveRecord, PushToService
end

我发现一些例子中,所有交互器逻辑的整体结果(记录应该被保存并推送到其他服务)已经过测试。但是,我不想执行其他交互器的逻辑,因为它们将作为其单独规范的一部分进行测试。

1. Is it possible to do so?
2. Which way of testing(testing the overall result/testing only this particular 
   organizer interactor behavior) is a better practise?
fzsnzjdm

fzsnzjdm1#

我相信我们需要测试包含的交互器的交互器组织者,而不执行包含的交互器。我能够找到一个方法存根,并使用下面的行测试组织者
至存根:

allow(SaveRecord).to receive(:call!) { :success }
  allow(PushToService).to receive(:call!) { :success }

待测试:

it { expect(interactor).to be_kind_of(Interactor::Organizer) }
it { expect(described_class.organized).to eq([SaveRecord, PushToService]) }

从交互组织器源文件中找到call! method & organized variable,它试图在其中调用和内部使用。存根call!方法和测试organized变量已满足我的要求。

hsgswve4

hsgswve42#

您可以测试它们的调用顺序:

it 'calls the interactors' do
  expect(SaveRecord).to receive(:call!).ordered
  expect(PushToService).to receive(:call!).ordered
  described_class.call
end

参见:https://relishapp.com/rspec/rspec-mocks/docs/setting-constraints/message-order

ffvjumwh

ffvjumwh3#

只是在@prem answer上迭代。
待测试:

it { expect(interactor).to be_kind_of(Interactor::Organizer) }
it { expect(described_class.organized).to eq([SaveRecord, PushToService]) }

在本例中,interactor是Interactor类的示例,或者在Rspec语法中:

let(:interactor) { described_class.new }

相关问题