ruby-on-rails - Rspec:声明一个变量,该变量将作为记录创建到方法中
问题描述
我对 Rails 很陌生,但我似乎面临着一个我无法解决的问题。我正在尝试测试将创建新记录并稍后使用它来实例化新服务的后台作业。
当我正在测试后台作业时,似乎我应该在测试之前将这项服务加倍,但是其中一个参数是在作业中创建的,使用在作业中创建的另一条记录作为参考。因此,每次我尝试运行它时,ID 总是会有所不同。
这是示例代码:
RSpec.describe UpdateVideoPerfDatasJob, :type => :job do
it { expect(described_class).to be < ActiveJob::Base }
context '#perform' do
let (:split_test) { create(:split_test_for_result_slot) }
let(:adwords_account) { split_test.adwords_account }
let(:user) { split_test.adwords_account.user }
let(:report_service) { instance_double('VideoPerformanceReportBis') }
let(:api_service) { instance_double('GoogleAdsApiWrapper') }
let(:campaigns_datas) { '#2 Api called...' }
let(:segments_datas) { '#3 Api called...' }
let(:data) { '#4 Global Array Created' }
before do
allow(VideoPerformanceReportBis).to receive(:new).with(split_test: split_test, adwords_account: adwords_account, user: user, result_slot: result_slot).and_return(report_service)
allow(GoogleAdsApiWrapper).to receive(:new).with(adwords_account: adwords_account, user: user).and_return(api_service)
allow(report_service).to receive(:refresh).with(no_args).and_return('#1 Refresh method')
allow(report_service).to receive(:call_api_campaigns).with(no_args).and_return(campaigns_datas)
allow(api_service).to receive(:get_campaigns).with(no_args).and_return('...and campaign gotten !')
allow(report_service).to receive(:call_api_segments).with(no_args).and_return(segments_datas)
allow(api_service).to receive(:get_campaigns_segments).with(no_args).and_return('... and segments gotten !')
allow(report_service).to receive(:create_global_array).with(campaigns_datas, segments_datas).and_return(data)
allow(report_service).to receive(:update).with(data).and_return('#5 update data')
class UpdateVideoPerfDatasJob < ApplicationJob
def perform(split_test:, adwords_account:, user:)
logger.warn 'Updating video performance data'
history_log = HistoryLog.create(
split_test: split_test,
user: user,
adwords_account: adwords_account,
operation: 'Update vidéo performance data',
messages: '',
status: 'Initiated'
)
result_slot = ResultSlot.create(
split_test: split_test,
history_log: history_log,
)
result_slot.previous_result_slot_id = split_test.result_slot.id unless split_test.result_slot.nil?
report_service = VideoPerformanceReportBis.new(
split_test: split_test,
adwords_account: adwords_account,
user: user,
result_slot: result_slot
)
response = report_service.refresh
history_log.update!(
messages: "Data updated on #{Date.today}",
status: 'Video performance data updated'
)
NotificationsChannel.broadcast_to user, 'Finished Update Video Performance Data Worker'
end
end
如您所见,VideoPerformanceReportService 使用 result_slot 作为参数,该参数在作业内部创建,使用 history_log(也在作业内部创建)作为参考。
我该如何测试呢?
(提前感谢大家的帮助)
解决方案
推荐阅读
- java - 什么相当于 PHP 中的 Java 中的 preg_replace 和 base64_decode?
- c# - 在 C# 中使用 'ref' 或 'out' 常见做法
- haskell - 当我的 do 不为空时,为什么会出现“Empty do”错误?
- python - 更改文本组件的比例
- python - 如何在图像中找到数字的中心坐标
- python - 获取按 ID 分区的每个字段的非空数据
- node.js - 使用 koa-jwt 仅保护某些路由
- ios - 如何在 Realm Swift 中将一对一关系迁移到一对多关系
- c++ - C/++/ASM - 是否可以从 0x0 读取堆栈/堆大小和虚拟内存地址空间?
- android - 华为 Push Kit 错误:907135701:范围列表为空