2015-06-23 2 views
0

Я создал пользовательскую задачу rake, которая удаляет все элементы с> = 7 дней. Я пытаюсь написать RSpec-тест для этой новой задачи, но похоже, что моя задача не работает в тесте. Я проверил задачу вручную, и она работает так, как ожидалось, но я не могу заставить RSpec работать. Я довольно новичок в RSpec.RSpec test for rake task

Библиотека/Задачи/todo.rake

namespace :todo do 
    desc "delete items older than 7 days" 
    task delete_items: :environment do 
    Item.where("created_at <= ?", Time.now - 7.days).destroy_all 
    end 
end 

спецификации/задачи/delete_items_task_spec.rb

require 'rails_helper' 
require 'rake' 

describe "todo namespace rake delete_items task" do 

    before do 
    MyApp::Application.load_tasks 
    Rake::Task.define_task(:environment) 
    end 

    let(:user) { FactoryGirl.create(:user) } 

    it "should delete all items older than 7 days" do 

    new_item = user.items.create(description: "New item") 
    old_item = user.items.create(description: "Old item") 

    old_item.created_at = 12.days.ago 

    expect(new_item.days_left).to eq 7 
    expect(old_item.days_left).to eq -5 

    Rake::Task["todo:delete_items"].invoke 

    # this is returning count = 2 which means old_item is not being deleted 
    expect(user.items.count).to eq 1 
    expect(user.items).to include(new_item) 
    expect(user.items).not_to include(old_item) 

    end 
end 

ответ

2

Пара вещей.
Прежде всего, вы должны положить created_at в метод create: user.items.create(description: "Old Item", created_at: 12.days.ago).

Во-вторых, вам нужно позвонить user.reload, чтобы изменения из вашей задачи рейка были доступны. Поэтому это должно выглядеть так: user.reload expect(user.items.count).to eq 1 и т.д.

2

Вы не сохранили old_item после установки created_at = 12.days.ago, так и в базе данных, это было все еще созданный только сейчас. Добавьте save, используйте update_attributes(created_at: 12.days.ago), или я уверен, вы можете просто включить created_at в атрибутах create.