【问题标题】:Rspec Rake Task: How to parse a parameter?Rspec Rake 任务:如何解析参数?
【发布时间】:2016-04-27 15:37:48
【问题描述】:

我有一个生成新用户的 rake 任务。 email、password和password_confirmation(确认)的值需要通过命令行输入。

这是我的 rake 任务代码:

namespace :db do
  namespace :setup do
    desc "Create Admin User"
    task :admin => :environment do
      ui       = HighLine.new      
      email    = ui.ask("Email: ")
      password = ui.ask("Enter password: ") { |q| q.echo = false }
      confirm  = ui.ask("Confirm password: ") { |q| q.echo = false }

      user = User.new(email: email, password: password,
                  password_confirmation: confirm)
      if user.save
        puts "User account created."
      else
        puts
        puts "Problem creating user account:"
        puts user.errors.full_messages
      end
    end
  end
end

我可以通过在命令行中输入“rake db:setup:admin”来调用它。

现在我想用 rspec 测试这个任务。 到目前为止,我设法创建了以下规范文件:

require 'spec_helper'
require 'rake'

describe "rake task setup:admin" do 
  before do
    load File.expand_path("../../../lib/tasks/setup.rake", __FILE__)
    Rake::Task.define_task(:environment)
  end

  let :run_rake_task do 
    Rake.application["db:setup:admin"]
  end

  it "creates a new User" do
    run_rake_task
  end
end

在运行规范时,我的 rake 任务将要求从我的命令行输入。所以我需要解析电子邮件、密码和确认的值,以便在执行我的规范时,rake 任务不会要求这些字段的值。

如何从规范文件中实现这一点?

【问题讨论】:

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


    【解决方案1】:

    你可以删掉HighLine:

    describe "rake task setup:admin" do
      let(:highline){ double(:highline) }
      let(:email){ "test@example.com" }
      let(:password){ "password" }
    
      before do
        load File.expand_path("../../../lib/tasks/setup.rake", __FILE__)
        Rake::Task.define_task(:environment)
        allow(HighlLine).to receive(:new).and_return(highline)
        allow(highline).to receive(:ask).with("Email: ").and_return(email)
        allow(highline).to receive(:ask).with("Enter password: ").and_return(password)
        allow(highline).to receive(:ask).with("Confirm password: ").and_return(password)
      end
    
      let :run_rake_task do
        Rake.application["db:setup:admin"]
      end
    
      it "creates a new User" do
        run_rake_task
      end
    end
    

    【讨论】:

    • 您将如何解决此错误? NameError: uninitialized constant HighlLine # ./spec/lib/tasks/data_rake_spec.rb:10:in `block (2 levels) in '
    猜你喜欢
    • 2015-12-29
    • 1970-01-01
    • 2014-09-06
    • 2015-09-05
    • 2016-08-05
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    相关资源
    最近更新 更多