背景
这是一个命令行程序。
我有一个通过gets
捕获用户输入的函数,我在返回输入之前使用它来验证输入。
我有一个#pick_names
方法。
def pick_names
@player_one = get_input("\nPlayer 1, choose a unique name (1-7 alphanumeric characters)", /[A-Za-z0-9]{1,7}$/)
puts "\nHi, #{@player_one}! Your coin will be #{@player_one_coin}"
loop do
@player_two = get_input("\nPlayer 2, choose a unique name (1-7 alphanumeric characters)", /[A-Za-z0-9]{1,7}$/)
break if @player_two != @player_one
end
puts "\nHello, #{@player_two}! Your coin will be #{@player_two_coin}"
end
它所要做的就是确保这两个名字不相同。
在这个函数的规范中,我得到了以下内容:
describe '#pick_names' do
context 'when picking names' do
let(:names) { ['bob', 'bob', 'bob', 'ok'] }
it 'rejects duplicates' do
expect(game).to receive(:get_input).with('choose a unique name').at_least(:once)
play
end
end
end
names
是一个延迟加载的变量,它部分地构成了每个测试所使用的args
。
let(:args) { ['y', *names, *moves] }
问题
在那个#pick_names
测试中,Rspec似乎在比较我预期的输入'choose unique name'和第一次使用get_input
时使用的文本,即Are you ready to begin? (y/n)
,这就是为什么args
的第一个参数是'y'
。
我知道'choose a unique name'字符串无论如何都不会被匹配,因为该字符串包含的内容不止这些。我可以稍后修改它。但为什么它在第一次使用get_input
时就开始匹配,而不是说没有找到匹配项呢?
1条答案
按热度按时间egdjgwm81#
我认为问题的一部分是你试图匹配字符串的一部分,而不是完整的输入。
为了调试,尝试为播放器1执行完全相同的字符串,看看它是否捕捉到该输入。
如果这样做有效,您将需要一些正则表达式来告诉RSpec显式匹配。