Надеюсь, что кто-то может указать, что я делаю неправильно здесь, так как я не могу пройти тест на рейк-тест, кажется, что после выполнения задачи rake я теряю свою переменную экземпляра, поскольку она возвращает NIL, где, как и прежде задача рек запустить я получаю записьПроверка моей рейк-задачи - Rails 4
Поэтому, прежде чем все мои тесты я иметь эту конфигурацию конфигурационного
ENV['RAILS_ENV'] ||= 'test'
require 'spec_helper'
require 'rake'
load File.expand_path('../../lib/tasks/create_events.rake', __FILE__)
load File.expand_path('../../lib/tasks/update_event.rake', __FILE__)
require File.expand_path('../../config/environment', __FILE__)
require 'rspec/rails'
ActiveRecord::Migration.maintain_test_schema!
RSpec.configure do |config|
config.fixture_path = "#{::Rails.root}/spec/fixtures"
config.before(:suite) do
DatabaseCleaner.strategy = :truncation
DatabaseCleaner.clean_with :truncation
Rake::Task.define_task(:environment)
Rake::Task['create_events:create_event_data'].invoke
end
config.after(:suite) do
DatabaseCleaner.clean
end
end
Мой файл спецификация настроена как так
require "rails_helper"
require 'rake'
RSpec.describe "update_event:next_event_date Rake Task" do
it "should change the next occurrence date" do
@update_event = Event.where(next_occurrence: Date.today)
# So here @update_event returns 1 record (Active Record Relation)
Rake::Task.define_task(:environment)
Rake::Task['update_event:next_event_date'].invoke
# By here @update_event = nil (Active Record Relation = [])
case @update_event.first.weekly_frequency
when 1
expect(@update_event.first.next_occurrence).to eq(Date.today + 7.days)
when 2
expect(@update_event.first.next_occurrence).to eq(Date.today + 14.days)
when 6
expect(@update_event.first.next_occurrence).to eq(Date.today + 42.days)
end
end
end
Что это причина заднее это и как я проверить это правильно
Моя текущая задача рек это
namespace :update_event do
desc "Update next_occurrence date for an event"
task next_event_date: :environment do
@event = Event.where(next_occurrence: Date.today)
@event.each do |e|
if e.weekly_frequency == 1
e.update_attributes next_occurrence: Date.today + 7.days
elsif e.weekly_frequency == 2
e.update_attributes next_occurrence: Date.today + 14.days
elsif e.weekly_frequency == 6
e.update_attributes next_occurrence: Date.today + 42.days
end
end
end
end
EDIT
Так я слегка изменил мою спецификацию к этому
require "rails_helper"
require 'rake'
RSpec.describe "update_event:next_event_date Rake Task" do
it "should change the next occurrence date" do
@update_event = Event.where(next_occurrence: Date.today)
event_id = Event.find(@update_event.first.id)
Rake::Task.define_task(:environment)
Rake::Task['update_event:next_event_date'].invoke
@after_update = Event.find(event_id)
case @after_update.weekly_frequency
when 1
expect(@after_update.next_occurrence).to eq(Date.today + 7.days)
when 2
expect(@after_update.next_occurrence).to eq(Date.today + 14.days)
when 6
expect(@after_update.next_occurrence).to eq(Date.today + 42.days)
end
end
end
Это проходит, но im не уверен, почему я потерял свою первую переменную экземпляра
Спасибо, что ответите, может быть, я немного смущен, так как я думал, что точка, в которой я взял запись из db и назначил ее @update_event, был до того, как я запустил свою задачу рейка? – Richlewis
Нет. 'where' возвращает объект запроса (т. е.' ActiveRelation'), который не выполняется, пока вы не вызовете на нем метод, который выполняет выполнение (например, 'first' или' all'). –
Ух ты, не знал этого, хорошо, что очищает все, спасибо – Richlewis