rake任务rspec测试未响应:have_received method

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

我有一个非常简单的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
其中,
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不同)

您的查询看起来非常简单,所以我会将其存根(或者将其移动到模型范围并在那里进行测试)

现在你剩下的存根应该可以用了