ruby 编写Rspec示例变量test

ecbunoof  于 2022-12-22  发布在  Ruby
关注(0)|答案(2)|浏览(138)

我试图测试一个示例变量是否保存了用户的输入,但我不知道如何保存。我希望测试通过,但它失败了,并输出expected "joe" got: ""到终端。下面是我要测试的方法:

def get_names
    while Player.players < 2
      while name.length <= 2
        puts 'Each player must choose a name'
        print 'Enter a name: '
        @name = gets.chomp
      end

      unless name == ''
        @player1 == '' ? @player1 = Player.new(name) : @player2 = Player.new(name)
        name = ''
        puts 'Name have been saved successfully'
      end
    end
  end

下面是rspec测试套件:

describe Game do
  subject(:game_names) { described_class.new }

  describe '#get_names' do
    context 'when a user inputs name' do
      it 'saves in name instance variable' do
        allow(game_names).to receive(:gets).and_return('joe')
        name = game_names.instance_variable_get(:@name)

        expect(name).to eq 'joe'

        game_names.get_names
      end
    end
  end
end

我试着模仿和stub类,方法和变量,但是我不能让它工作。这是我第一次写测试。

mf98qq94

mf98qq941#

如果不知道GamePlayer类的其余部分是什么样子的,我会说您的测试中可能存在执行顺序问题,我下面的假设是您的initialize方法中可能没有@name示例变量。
所以在你的测试中,你要把对gets的调用存根化,然后返回'joe',这很酷,也正是你想要的。但是下一行得到的示例变量@name,在那个时候并不存在于类中,因为设置那个示例变量的方法还没有被调用。并且未声明的示例变量总是保存这个值。nil.
因此,您实际上是在比较nil'joe',它们永远不会通过。
您要做的是将game_names.get_names移到allow下,然后是instance_variable_get行,最后是expectAssert。

describe Game do
  subject(:game_names) { described_class.new }

  describe '#get_names' do
    context 'when a user inputs name' do
      it 'saves in name instance variable' do
        allow(game_names).to receive(:gets).and_return('joe')
        game_names.get_names

        name = game_names.instance_variable_get(:@name)
        expect(name).to eq 'joe'
      end
    end
  end
end
k10s72fa

k10s72fa2#

这个bug是在保存输入后将name赋值给空字符串,所以我将其注解掉,测试通过了。

相关问题