RSpec 由于使用 ARGV 而不是 .gets,测试失败
RSpec tests failing due to ARGV used instead of .gets
我正在构建一个程序,该程序需要从用户那里获取一个数字,但是当 运行 一个这样的程序时,用户会将其作为参数传递到控制台:“ ruby name_of_program.rb --number 25 " 我最初使用 gets.chomp() 但由于它没有收集参数 25 我很快将其更改为 ARGV。我的所有 RSpec 测试都失败了,我收到以下消息:TypeError:nil can't be coerced into Integer。我想找出原因。我的程序按预期工作。我怎样才能让我的测试再次工作?
first_number = 2
given_number = ARGV.last
given_number = given_number.to_i
arr = []
def prime_numbers(first_number, given_number, arr)
while(first_number <= given_number)
prime_number = true
x = 2
while (x <= first_number / 2)
if (first_number % x == 0)
prime_number = false
break
end
x += 1
end
if prime_number
arr << first_number
end
first_number += 1
end
return arr
end
示例测试:
require 'prime_factors'
RSpec.describe 'prime_factors' do
let(:array_one) { [2, 3, 5, 7] }
let(:empty_array) { [] }
let(:first_number) { 2 }
context 'prime_numbers function' do
it 'returns a list of prime numbers for a range 2 - 10 ' do
given_number = 10
expect(prime_numbers(first_number, given_number, empty_array)).to eq [2, 3, 5, 7]
end
end
end
当你 require
这个程序(你似乎在做什么)时,它评估 ARGV.last
其中 returns 为零,因为 ARGV(可能)是一个空数组。
我会将 prime_numbers
的定义放在一个单独的文件中,并在您的 rspec 测试中需要此文件。
前面的答案为您提供了正确的方法,但是如果您想使用命令行参数测试您的程序,您可以这样做。为简单起见,我删除了命令行参数的标志,只传递了 2 个数字,但如果需要,您可以修改它:
#app.rb
first_number = ARGV.first.to_i
given_number = ARGV.last.to_i
arr = []
def prime_numbers(first_number, given_number, arr)
while(first_number <= given_number)
prime_number = true
x = 2
while (x <= first_number / 2)
if (first_number % x == 0)
prime_number = false
break
end
x += 1
end
if prime_number
arr << first_number
end
first_number += 1
end
return arr
end
print prime_numbers(first_number, given_number, arr)
还有你的规范文件
#spec/app_spec.rb
RSpec.describe 'prime_factors' do
let(:exec) { File.expand_path('../app.rb', File.dirname(__FILE__)) }
describe 'app' do
it 'returns a list of prime numbers for a range 2 - 10 ' do
given_number = 10
res = `ruby #{exec} #{2} #{10}`
expect(res).to eq '[2, 3, 5, 7]'
end
end
end
如果你想在命令行参数中传递标志,你可以像这样解析数字:
args = ARGV.map(&:to_i).select{|arg| arg > 0}
first_number = args.first
given_number = args.last
我已将 prime_factors.rb 分成 3 个单独的文件,并相应地在 prime_factors_spec.rb 中要求它们。非常感谢大家!
我正在构建一个程序,该程序需要从用户那里获取一个数字,但是当 运行 一个这样的程序时,用户会将其作为参数传递到控制台:“ ruby name_of_program.rb --number 25 " 我最初使用 gets.chomp() 但由于它没有收集参数 25 我很快将其更改为 ARGV。我的所有 RSpec 测试都失败了,我收到以下消息:TypeError:nil can't be coerced into Integer。我想找出原因。我的程序按预期工作。我怎样才能让我的测试再次工作?
first_number = 2
given_number = ARGV.last
given_number = given_number.to_i
arr = []
def prime_numbers(first_number, given_number, arr)
while(first_number <= given_number)
prime_number = true
x = 2
while (x <= first_number / 2)
if (first_number % x == 0)
prime_number = false
break
end
x += 1
end
if prime_number
arr << first_number
end
first_number += 1
end
return arr
end
示例测试:
require 'prime_factors'
RSpec.describe 'prime_factors' do
let(:array_one) { [2, 3, 5, 7] }
let(:empty_array) { [] }
let(:first_number) { 2 }
context 'prime_numbers function' do
it 'returns a list of prime numbers for a range 2 - 10 ' do
given_number = 10
expect(prime_numbers(first_number, given_number, empty_array)).to eq [2, 3, 5, 7]
end
end
end
当你 require
这个程序(你似乎在做什么)时,它评估 ARGV.last
其中 returns 为零,因为 ARGV(可能)是一个空数组。
我会将 prime_numbers
的定义放在一个单独的文件中,并在您的 rspec 测试中需要此文件。
前面的答案为您提供了正确的方法,但是如果您想使用命令行参数测试您的程序,您可以这样做。为简单起见,我删除了命令行参数的标志,只传递了 2 个数字,但如果需要,您可以修改它:
#app.rb
first_number = ARGV.first.to_i
given_number = ARGV.last.to_i
arr = []
def prime_numbers(first_number, given_number, arr)
while(first_number <= given_number)
prime_number = true
x = 2
while (x <= first_number / 2)
if (first_number % x == 0)
prime_number = false
break
end
x += 1
end
if prime_number
arr << first_number
end
first_number += 1
end
return arr
end
print prime_numbers(first_number, given_number, arr)
还有你的规范文件
#spec/app_spec.rb
RSpec.describe 'prime_factors' do
let(:exec) { File.expand_path('../app.rb', File.dirname(__FILE__)) }
describe 'app' do
it 'returns a list of prime numbers for a range 2 - 10 ' do
given_number = 10
res = `ruby #{exec} #{2} #{10}`
expect(res).to eq '[2, 3, 5, 7]'
end
end
end
如果你想在命令行参数中传递标志,你可以像这样解析数字:
args = ARGV.map(&:to_i).select{|arg| arg > 0}
first_number = args.first
given_number = args.last
我已将 prime_factors.rb 分成 3 个单独的文件,并相应地在 prime_factors_spec.rb 中要求它们。非常感谢大家!