繁体   English   中英

RSpec测试耙任务

[英]RSpec test for rake task

我创建了一个自定义rake任务,该任务将删除所有大于等于7天的项目。 我正在尝试为此新任务编写RSpec测试,但似乎我的任务并未真正在测试中运行。 我已经手动测试了该任务,它可以按预期工作,但是我似乎无法使RSpec测试正常工作。 我是RSpec的新手。

LIB /任务/ 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

在设置created_at = 12.days.ago old_item之后,您还没有保存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 etc

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM