2015-05-23 2 views
0

Надеюсь, что кто-то может указать, что я делаю неправильно здесь, так как я не могу пройти тест на рейк-тест, кажется, что после выполнения задачи 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 не уверен, почему я потерял свою первую переменную экземпляра

ответ

1

Вы не «теряете» свою переменная экземпляра. Ваша переменная экземпляра - это запрос, который даст разные результаты до и после вашей рейк-задачи. Ваш модифицированный тест выполняет запрос перед задачей rake и сохраняет что-то, полученное из результата, в локальной переменной (то есть в идентификаторе первой записи). Вы можете достичь аналогичного эффекта за счет экономии событие следующим образом:

@update_event = Event.find_by(next_occurrence: Date.today) 

с момента find_by, возвращает ActiveRecord не ActiveRelation.

+0

Спасибо, что ответите, может быть, я немного смущен, так как я думал, что точка, в которой я взял запись из db и назначил ее @update_event, был до того, как я запустил свою задачу рейка? – Richlewis

+0

Нет. 'where' возвращает объект запроса (т. е.' ActiveRelation'), который не выполняется, пока вы не вызовете на нем метод, который выполняет выполнение (например, 'first' или' all'). –

+0

Ух ты, не знал этого, хорошо, что очищает все, спасибо – Richlewis

Смежные вопросы