使用FactoryGirl用户可以测试Rake任务

时间:2017-06-07 10:00:25

标签: ruby-on-rails rspec rake factory-bot database-cleaner

我一直试图用RSPEC测试rake任务。到目前为止,我对该问题的理解是,数据库事务正在为测试的每个方面创建不同的上下文(一个在测试上下文中,一个在rake任务执行上下文中)。以下是我在测试中使用的两个文件:

一个在Rspec中提供rake任务并且能够调用task.execute:

...spec/support/tasks.rb

require "rake"

module TaskExampleGroup
  extend ActiveSupport::Concern
  included do
    let(:task_name) { self.class.top_level_description.sub(/\Arake /, "") }
    let(:tasks) { Rake::Task }
    subject(:task) { tasks[task_name] }
  end
end

RSpec.configure do |config|
  config.define_derived_metadata(:file_path => %r{/spec/tasks/}) do |metadata|
    metadata[:type] = :task
  end
  config.include TaskExampleGroup, type: :task
  config.before(:suite) do
    Rails.application.load_tasks
  end
end

正确测试我的佣金任务:

...spec/tasks/reengage_spec.rb

require "rails_helper"

describe "rake reengage:unverified_users", type: :task do

  let(:confirmed_user){create(:user, :confirmed)}

  it "Preloads the Rails environment" do
    expect(task.prerequisites).to include "environment"
  end

  it "Runs gracefully with no users" do
    expect { task.execute }.not_to raise_error
  end

  it "Logs to stdout without errors" do
    expect { task.execute }.to_not output.to_stderr
  end

  it "Reengage confirmed users" do
    task.execute
    expect(confirmed_user).to have_attributes(:reactivated_at => DateTime.now)
  end

end

到目前为止,当通过Rspec执行rake任务时,似乎我创建的用户在rake的上下文中不可用,因此他的。 reactivated_at仍然是零。我虽然可以使用数据库清理器来配置数据库事务并保留上下文但我不知道从哪里开始。

我可以把所有这些代码放在一个lib中并单独测试,但我想知道是否有办法做到这一点。在初始化任务时,是否有直接的方式来共享执行上下文或使FactoryGirl用户可用?

0 个答案:

没有答案