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)
正如您可能猜到的那样,这些都不起作用。有谁知道做这种事情的正确方法?有可能吗?
一般来说,我不喜欢使用短链,因为它们通常是违反德米特法则的标志。但是,如果必须的话,我会这样嘲笑这个序列:
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)
| 归档时间: |
|
| 查看次数: |
6908 次 |
| 最近记录: |