【问题标题】:Why is Rspec's 'expect to receive' capturing only the first occurrence?为什么 Rspec\'s \'expect to receive\' 只捕获第一次出现?
【发布时间】: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

标签: ruby testing rspec


【解决方案1】:

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

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

对于调试,请尝试为玩家 1 执行确切的字符串,并查看它是否捕获了该输入。

如果可行,您将需要一些正则表达式来告诉 RSpec 显式匹配。

【讨论】:

    猜你喜欢
    • 2021-08-27
    • 2020-10-22
    • 2010-09-25
    • 2016-11-23
    • 2018-10-25
    • 1970-01-01
    • 2017-05-29
    • 2019-11-18
    • 2012-02-02
    相关资源
    最近更新 更多