ruby 为什么Rspec的“expect to receive”只捕获第一个事件?

cuxqih21  于 2022-11-04  发布在  Ruby
关注(0)|答案(1)|浏览(166)

背景

这是一个命令行程序。
我有一个通过gets捕获用户输入的函数,我在返回输入之前使用它来验证输入。
我有一个#pick_names方法。

  1. def pick_names
  2. @player_one = get_input("\nPlayer 1, choose a unique name (1-7 alphanumeric characters)", /[A-Za-z0-9]{1,7}$/)
  3. puts "\nHi, #{@player_one}! Your coin will be #{@player_one_coin}"
  4. loop do
  5. @player_two = get_input("\nPlayer 2, choose a unique name (1-7 alphanumeric characters)", /[A-Za-z0-9]{1,7}$/)
  6. break if @player_two != @player_one
  7. end
  8. puts "\nHello, #{@player_two}! Your coin will be #{@player_two_coin}"
  9. end

它所要做的就是确保这两个名字不相同。
在这个函数的规范中,我得到了以下内容:

  1. describe '#pick_names' do
  2. context 'when picking names' do
  3. let(:names) { ['bob', 'bob', 'bob', 'ok'] }
  4. it 'rejects duplicates' do
  5. expect(game).to receive(:get_input).with('choose a unique name').at_least(:once)
  6. play
  7. end
  8. end
  9. end

names是一个延迟加载的变量,它部分地构成了每个测试所使用的args

  1. 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时就开始匹配,而不是说没有找到匹配项呢?

egdjgwm8

egdjgwm81#

我认为问题的一部分是你试图匹配字符串的一部分,而不是完整的输入。

  1. "\nPlayer 1, choose a unique name (1-7 alphanumeric characters)" != 'choose a unique name'

为了调试,尝试为播放器1执行完全相同的字符串,看看它是否捕捉到该输入。
如果这样做有效,您将需要一些正则表达式来告诉RSpec显式匹配。

相关问题