如何使用 Rspec “期望”一系列方法,其中第一个方法采用参数?

whe*_*hip 4 ruby rspec ruby-on-rails mocking

我在 ruby​​ 模型中有一个方法调用,如下所示:

Contentful::PartnerCampaign.find_by(vanityUrl: referral_source).load.first
Run Code Online (Sandbox Code Playgroud)

在模型spec.rb 文件中,我尝试模拟该调用并通过传入参数来获取值。但我无法弄清楚正确的调用方式。

在我的 spec.rb 文件的顶部,我有:

 let(:first_double) { 
   double("Contentful::Model", fields {:promotion_type => "Promotion 1"}) 
 }
Run Code Online (Sandbox Code Playgroud)

在描述块中,我尝试了以下操作:

expect(Contentful::PartnerCampaign).to receive_message_chain(:find_by, :load, :first).
                                       and_return(first_double)

expect(Contentful::PartnerCampaign).to receive_message_chain(:find_by, :load, :first).with(vanityUrl: 'test_promo_path').
                                       and_return(first_double)

expect(Contentful::PartnerCampaign).to receive_message_chain(:find_by => vanityUrl: 'test_promo_path', :load, :first).
                                       and_return(first_double)
Run Code Online (Sandbox Code Playgroud)

正如您可能猜到的那样,这些都不起作用。有谁知道做这种事情的正确方法?有可能吗?

ari*_*ver 9

一般来说,我不喜欢使用短链,因为它们通常是违反德米特法则的标志。但是,如果必须的话,我会这样嘲笑这个序列:

let(:vanity_url) { 'https://vanity.url' }
let(:partner_campaigns) { double('partner_campaigns') }
let(:loaded_partner_campaigns) { double('loaded_partner_campaigns') }

let(:partner_campaign) do
  double("Contentful::Model", fields {:promotion_type => "Promotion 1"}
end

before do
  allow(Contentful::PartnerCampaign)
    .to receive(:find_by)
    .with(vanity_url: vanity_url)
    .and_return(partner_campaigns)

  allow(partner_campaigns)
    .to receive(:load)
    .and_return(loaded_partner_campaigns)

  allow(loaded_partner_campaigns)
    .to receive(:first)
    .and_return(partner_campaign)
end
Run Code Online (Sandbox Code Playgroud)