【发布时间】:2020-11-22 18:36:10
【问题描述】:
我正在用 Ruby 构建一个 CLI,并且我正在使用 ARGV 在命令行中传递选项和参数。我有一个在执行 CLI 时触发的调用方法。 调用方法如下:
module Eltiempo
class CLI
def call
help_menu if ARGV.count.zero?
case ARGV[0]
when '-today'
raise NoCityError if ARGV[1].nil?
Eltiempo.today(ARGV[1])
when '-av_min'
raise NoCityError if ARGV[1].nil?
Eltiempo.av_min(ARGV[1])
when '-av_max'
raise NoCityError if ARGV[1].nil?
Eltiempo.av_max(ARGV[1])
when '-h'
help_menu
end
end
在使用 rspec 对第一个案例选项(-today)进行测试时,我编写了以下代码:
RSpec.describe Eltiempo do
describe '#call' do
context 'given -today' do
let(:ARGV) { ['-today', 'Barcelona'] }
it 'calls function to return today\'s weather' do
expect(Eltiempo::CLI.new.call).to receive(Eltiempo.today).with(ARGV[1])
end
end
end
end
但是,当运行 rspec 时,它没有通过测试,它说:
Failure/Error:
def self.today(city_name)
max = max_today(city_name)
min = min_today(city_name)
puts "Weather today in #{city_name.capitalize}:
- Maximum: #{max}°C
- Minimum: #{min}°C"
end
ArgumentError:
wrong number of arguments (given 0, expected 1)
它试图在 Eltiempo 模块中调用方法 self.today(city_name) 并在没有 city_name 参数的情况下运行,但是,我不希望它运行我只想检查选项和参数 -today Barcelona 时的方法运行时,它调用Eltiempo.today(ARGV[1])。
为什么运行self.today(city_name)?
【问题讨论】: