RSpec rake 任务测试
RSpec test for rake task
我创建了一个自定义 rake 任务,它删除了所有 >= 7 天的项目。我正在尝试为这个新任务编写一个 RSpec 测试,但似乎我的任务在测试中并不是真正的 运行。我已经手动测试了该任务,它按预期工作,但我似乎无法让 RSpec 测试工作。我是 RSpec.
的新手
lib/tasks/todo.耙
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
spec/tasks/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
你设置created_at = 12.days.ago
后还没有保存old_item
,所以在数据库中,还是刚才创建的。添加 save
,使用 update_attributes(created_at: 12.days.ago)
,或者我很确定您可以在 create
属性中包含 created_at
。
几件事。
首先,你应该把 created_at
放在 create
方法中: user.items.create(description: "Old Item", created_at: 12.days.ago)
.
其次,您需要调用 user.reload
以便您的 rake 任务的更改可用。所以它应该是这样的:
user.reload
expect(user.items.count).to eq 1
等等
我创建了一个自定义 rake 任务,它删除了所有 >= 7 天的项目。我正在尝试为这个新任务编写一个 RSpec 测试,但似乎我的任务在测试中并不是真正的 运行。我已经手动测试了该任务,它按预期工作,但我似乎无法让 RSpec 测试工作。我是 RSpec.
的新手lib/tasks/todo.耙
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
spec/tasks/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
你设置created_at = 12.days.ago
后还没有保存old_item
,所以在数据库中,还是刚才创建的。添加 save
,使用 update_attributes(created_at: 12.days.ago)
,或者我很确定您可以在 create
属性中包含 created_at
。
几件事。
首先,你应该把 created_at
放在 create
方法中: user.items.create(description: "Old Item", created_at: 12.days.ago)
.
其次,您需要调用 user.reload
以便您的 rake 任务的更改可用。所以它应该是这样的:
user.reload
expect(user.items.count).to eq 1
等等