我一直试图用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用户可用?