idr*_*ale 2 ruby rspec ruby-on-rails
我EmailTrainersAboutMissingReports.call
对要求它调用的服务进行了测试TrainerMonitorMailer.missing_run_reports
:
describe EmailTrainersAboutMissingReports do
describe ('::call') do
context 'missing two group runs' do
let!(:group_run) { FactoryGirl.create :group_run, started_at: 1.day.ago }
let!(:group_run_2) { FactoryGirl.create :group_run, started_at: 1.day.ago }
it 'is successful' do
expect(TrainerMonitorMailer).to receive(:missing_run_reports).with(area,
[group_run, group_run_2])
EmailTrainersAboutMissingReports.call
end
end
end
end
Run Code Online (Sandbox Code Playgroud)
随附服务的代码如下所示:
class EmailTrainersAboutMissingReports
def self.call
response = RunReportMonitor.check_all_got_published_on_time(area)
unless response.success?
TrainerMonitorMailer.missing_run_reports(area, response.group_runs_missing_reports).deliver
end
end
end
Run Code Online (Sandbox Code Playgroud)
我遇到麻烦的地方是我将deliver
方法链接到邮件程序.所以,当我运行测试时,我会收到:
undefined method `deliver' for nil:NilClass
Run Code Online (Sandbox Code Playgroud)
我如何定义期望,以便它期望带有上述参数的missing_run_reports,但是也期望这个链接调用.deliver?
同时保留邮件传递.在最初的期望中返回,然后期望它收到deliver
.像这样:
it 'is successful' do
message_delivery = instance_double(ActionMailer::MessageDelivery)
expect(TrainerMonitorMailer).to receive(:missing_run_reports).
with(area, [group_run, group_run_2]).
and_return(message_delivery)
expect(message_delivery).to receive(:deliver)
EmailTrainersAboutMissingReports.call
end
Run Code Online (Sandbox Code Playgroud)