тест rspec для рейка не отвечает на метод: have_received - PullRequest
1 голос
/ 06 мая 2019

У меня довольно простая задача по рейку:

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_trial_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).to receive и после запуска задачи, но в обоих случаях выдает ту же ошибку:

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(expires_at: Date.today.all_day) вернул мой subscription, и это так. Проблема в received или have_received.

1 Ответ

0 голосов
/ 07 мая 2019

Проблема в

allow(subscription).to receive(:user) { user }

Объект subscription здесь не тот же объект, который возвращается из вашего запроса: Subscription.where(expires_at: Date.today.all_day).Да, с практической точки зрения это одна и та же запись, но не с точки зрения тестов (идентификаторы объекта разные).

Ваш запрос выглядит очень простым, поэтому я бы заглушил его (или переместил насмоделируйте область действия и проверьте ее там).

allow(Subscription).to receive(:where).with(expires_at: Date.today).and_return([subscription])

Теперь остальные ваши заглушки должны работать.

...