rake任务rspec测试未响应:have_received method
我有一个非常简单的rake任务:rake任务rspec测试未响应:have_received method,rspec,ruby-on-rails-5,rake-task,Rspec,Ruby On Rails 5,Rake Task,我有一个非常简单的rake任务: namespace :subscriptions do desc 'Send expired subscription notifications' task notify_trial_expired: :environment do Subscription.where(expires_at: Date.today.all_day).each { |s| s.user.notify_trial_expired } end end 其中,n
namespace :subscriptions do
desc 'Send expired subscription notifications'
task notify_trial_expired: :environment do
Subscription.where(expires_at: Date.today.all_day).each { |s| s.user.notify_trial_expired }
end
end
其中,notify\u trial\u expired
是模型User
的实例方法。
通过手动测试,该任务运行良好
现在使用rspec,我写了以下内容:
require 'rails_helper'
describe "notify_trial_expired" do
let!(:subscription) { create(:subscription, expires_at: Date.today) }
let(:user) { double(:user) }
before do
allow(subscription).to receive(:user) { user }
allow(user).to receive(:notify_trial_expired)
Rake.application.rake_require "tasks/subscriptions"
Rake::Task.define_task(:environment)
Rake::Task['subscriptions:notify_trial_expired'].invoke
end
it "should notify all user which trial expires today" do
expect(user).to have_received(:notify_trial_expired)
end
end
我还尝试了使用expect(user)。接收并在之后调用任务,但两种方式都显示相同的错误:
Failure/Error: expect(user).to have_received(:notify_trial_expired)
(Double :user).notify_trial_expired(*(any args))
expected: 1 time with any arguments
received: 0 times with any arguments
我还检查了以确保查询Subscription.where(过期时间:Date.today.all_day)
返回我的Subscription
,它确实返回了。它是在已接收
或已接收
方法中发出的 问题是
allow(subscription).to receive(:user) { user }
这里的对象subscription
与查询返回的对象不同:subscription.where(过期时间:Date.today.all\u day)
。是的,在所有实际术语中,它们都是相同的记录,但不是从测试的角度来看(对象id不同)
您的查询看起来非常简单,所以我会将其存根(或者将其移动到模型范围并在那里进行测试)
现在剩下的存根应该可以工作了。问题是
allow(subscription).to receive(:user) { user }
这里的对象subscription
与查询返回的对象不同:subscription.where(过期时间:Date.today.all\u day)
。是的,在所有实际术语中,它们都是相同的记录,但不是从测试的角度来看(对象id不同)
您的查询看起来非常简单,所以我会将其存根(或者将其移动到模型范围并在那里进行测试)
现在你剩下的存根应该可以用了