【发布时间】:2022-10-23 22:21:30
【问题描述】:
背景
这是一个命令行程序。
我有一个通过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 似乎将我预期的输入“选择唯一名称”与get_input 的第一次使用中使用的文本进行比较,即Are you ready to begin? (y/n),因此args 的第一个参数是@ 987654333@。
我知道“选择一个唯一的名称”字符串无论如何都不会匹配,因为该字符串包含的不仅仅是这些。我可以稍后修改。但是为什么它会在第一次使用 get_input 时开始使用,而不是说没有找到匹配项?
【问题讨论】:
-
嘿,巴里,我认为您将不得不发布更多代码。例如,您的规范中在哪里定义了游戏?是测试替身吗?
-
绝对地。我不想污染这个问题,但我意识到我可能会让它变得更加困难。我已将游戏粘贴到代码共享中,希望我没有违反任何规则:codeshare.io/BA4Xwy