这是给出错误/故障的方法:
def draw?(board)
if full?(board) == true && won?(board) == false
return true
else
return false
end
end
该方法可以完成所有应做的事情,但这是我运行rspec文件时出现的错误:
1) ./lib/tic_tac_toe.rb #draw? calls won? and full?
Failure/Error: expect(self).to receive(:won?).with(board)
(#<RSpec::ExampleGroups::LibTicTacToeRb::Draw:0x00000002e300b0>).won?(["X", "O", "X", "O", "X", "X", "O", "X", "O"])
expected: 1 time with arguments: (["X", "O", "X", "O", "X", "X", "O", "X", "O"])
received: 0 times
这是rspec测试:
describe '#draw?' do
it 'calls won? and full?' do
board = ["X", "O", "X", "O", "X", "X", "O", "X", "O"]
expect(self).to receive(:won?).with(board)
expect(self).to receive(:full?).with(board)
draw?(board)
end
本质上,我读:#draw?无法拨打#full?并赢得?
但是当我看我的#draw时?方法,我叫他们!作为“如果”的条件!
那我要去哪里错了?
非常感谢您的帮助!
我目前正在学习Ruby。
1)您的整个draw?
方法可以简化为一行:full?(board) && !won?(board)
2)您需要expect
监视类的实例,如果正在测试类方法,则需要监视类本身。您正在使用的self
将是RSpec本身,而不是要测试的基础类。由于我不知道它的名字,所以我假设它叫Game
。尝试这样的事情:
describe '#draw?' do
it 'calls draw? and full?' do
board = ["X", "O", "X", "O", "X", "X", "O", "X", "O"]
game = Game.new
expect(game).to receive(:won?).with(board)
expect(game).to receive(:full?).with(board)
game.draw?
end
end
3)这里的另一个问题是,您期望两种方法都可以被调用,但是won?
如果full?
return ,则不会被调用false
。这是由于短路引起的。在所有语句必须评估为true(或false)的情况下,一旦其中一个语句不为真,其余语句就不会被评估。考虑以下示例:if user != nil && user.admin?
。您要在此处短路,以便如果第一个语句不正确,则第二个语句不会得到评估。通常,不必要浪费资源来评估其输出无关紧要的语句。
4)最后,通常最好不要测试该函数的输出,而不是测试其工作原理的内部。最好进行一堆测试,在这些测试中您先传递数据,然后传递expect
结果。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句