【问题标题】:RSpec test for rake taskrake 任务的 RSpec 测试
【发布时间】:2015-06-23 23:41:19
【问题描述】:

我创建了一个自定义 rake 任务,用于删除 >= 7 天前的所有项目。我正在尝试为这个新任务编写一个 RSpec 测试,但似乎我的任务并没有真正在测试中运行。我已经手动测试了该任务,它按预期工作,但我似乎无法让 RSpec 测试工作。我对 RSpec 还很陌生。

lib/tasks/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

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

【问题讨论】:

    标签: ruby-on-rails ruby rspec rake-task


    【解决方案1】:

    几件事。
    首先,您应该将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 等等

    【讨论】:

      【解决方案2】:

      设置created_at = 12.days.ago后还没有保存old_item,所以在数据库中,还是刚才创建的。添加save,使用update_attributes(created_at: 12.days.ago),或者我很确定您可以在create 属性中包含created_at

      【讨论】:

        猜你喜欢
        • 2015-12-29
        • 2014-09-06
        • 2011-10-17
        • 2017-09-24
        • 1970-01-01
        • 2011-02-06
        • 1970-01-01
        • 2010-11-18
        • 1970-01-01
        相关资源
        最近更新 更多