使用Rails环境测试带Rspec的Rake任务

use*_*677 20 ruby rspec ruby-on-rails

我正在尝试测试一个rake任务,它在其中使用了一个活动记录.

require 'spec_helper'
require 'rake'

load File.join(Rails.root, 'lib', 'tasks', 'survey.rake')

describe "survey rake tasks" do
  describe "survey:send_report" do
    it "should send a report" do
      Rake::Task['survey:send_report'].invoke
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

当我运行此规范时rspec spec/lib/survey_spec.rb,我收到此错误"

RuntimeError:
   Don't know how to build task 'environment'
Run Code Online (Sandbox Code Playgroud)

如何通过示例规范加载:enviroment任务?

Erd*_*zer 32

我认为你应该首先加载任务:

require 'rake'
MyRailsApp::Application.load_tasks
Run Code Online (Sandbox Code Playgroud)

然后调用你的任务:

Rake::Task['survey:send_report'].invoke
Run Code Online (Sandbox Code Playgroud)

  • 什么是“MyRailsApp”? (2认同)

Myr*_*ton 9

我怀疑问题是你的survey:send_report任务取决于:environment你没有加载定义:environment任务的文件.那将是某个地方的轨道,而你的主要Rakefile载入它.

所以,我想如果你改变了

load File.join(Rails.root, 'lib', 'tasks', 'survey.rake')
Run Code Online (Sandbox Code Playgroud)

load File.join(Rails.root, 'Rakefile')
Run Code Online (Sandbox Code Playgroud)

它会工作的.


Win*_*zan 7

听起来像你的take任务可能需要加载Rails环境.您可以通过将此行添加到before(:all)挂钩来存根:

Rake::Task.define_task(:environment)
Run Code Online (Sandbox Code Playgroud)


Kry*_*man 0

您的任务是否添加了 :environment 来执行此操作?在你的 .rake 文件中你应该有这样的内容:

namespace :survey do
# ...

task :send_report => :enviroment do
# ... stuff
end
Run Code Online (Sandbox Code Playgroud)

这是因为您需要加载完整的环境才能完成该任务。您可以查看此 Railcast 以获取更多信息http://railscasts.com/episodes/66-custom-rake-tasks