Rspec Rake Task: Как распарсить параметр?

У меня есть задача rake, которая генерирует нового пользователя. Значения электронной почты, пароля и 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 не запрашивала значение этих полей.

Как я могу добиться этого из файла спецификации?


person ChrisK    schedule 21.01.2016    source источник


Ответы (1)


Вы можете заглушить HighLine:

describe "rake task setup:admin" do
  let(:highline){ double(:highline) }
  let(:email){ "[email protected]" }
  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
person Ruy Diaz    schedule 23.01.2016
comment
Как бы вы обошли эту ошибку? NameError: неинициализированная константа HighlLine # ./spec/lib/tasks/data_rake_spec.rb:10:in `блок (2 уровня) в ‹top (обязательно)›' - person Chris Hough; 29.01.2017