我试图测试一个示例变量是否保存了用户的输入,但我不知道如何保存。我希望测试通过,但它失败了,并输出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类,方法和变量,但是我不能让它工作。这是我第一次写测试。
2条答案
按热度按时间mf98qq941#
如果不知道
Game
和Player
类的其余部分是什么样子的,我会说您的测试中可能存在执行顺序问题,我下面的假设是您的initialize
方法中可能没有@name
示例变量。所以在你的测试中,你要把对
gets
的调用存根化,然后返回'joe'
,这很酷,也正是你想要的。但是下一行得到的示例变量@name
,在那个时候并不存在于类中,因为设置那个示例变量的方法还没有被调用。并且未声明的示例变量总是保存这个值。nil
.因此,您实际上是在比较
nil
和'joe'
,它们永远不会通过。您要做的是将
game_names.get_names
移到allow
下,然后是instance_variable_get
行,最后是expect
Assert。k10s72fa2#
这个bug是在保存输入后将
name
赋值给空字符串,所以我将其注解掉,测试通过了。