RSPEC 调用方法错误
RSPEC Calling Methods Error
这是给出 error/falure 的方法:
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?和#won?
但是当我看我的#draw 时?方法,我调用它们! 作为 "if" 条件!
所以我哪里错了?
非常感谢帮助!
我目前正在学习 Ruby。
1) 您的整个 draw?
方法可以简化为一行:full?(board) && !won?(board)
2) 如果您正在测试 class 方法,您需要 expect
监视 class 的实例或 class 本身。您使用的 self
本身就是 RSpec, 而不是 您正在测试的底层 class。因为我不知道它的名字,所以我假设它叫做 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) 这里的另一个问题是您希望这两种方法都被调用,但是如果 full?
returns false
则不会调用 won?
。这是由于 short circuiting。在所有陈述都必须评估为真(或假)的情况下,一旦其中一个不评估,则不会评估其余的。想想这样的例子:if user != nil && user.admin?
。您 想要 short-circuiting 以便在第一个语句不正确时不会对第二个语句进行评估。通常,对输出无关紧要的语句求值是一种不必要的资源使用。
4) 最后,一般来说,您最好测试函数的输出,而不是测试其工作原理的内部结构。最好在传递数据的地方进行一堆测试,然后 expect
结果。
这是给出 error/falure 的方法:
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?和#won?
但是当我看我的#draw 时?方法,我调用它们! 作为 "if" 条件!
所以我哪里错了?
非常感谢帮助!
我目前正在学习 Ruby。
1) 您的整个 draw?
方法可以简化为一行:full?(board) && !won?(board)
2) 如果您正在测试 class 方法,您需要 expect
监视 class 的实例或 class 本身。您使用的 self
本身就是 RSpec, 而不是 您正在测试的底层 class。因为我不知道它的名字,所以我假设它叫做 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) 这里的另一个问题是您希望这两种方法都被调用,但是如果 full?
returns false
则不会调用 won?
。这是由于 short circuiting。在所有陈述都必须评估为真(或假)的情况下,一旦其中一个不评估,则不会评估其余的。想想这样的例子:if user != nil && user.admin?
。您 想要 short-circuiting 以便在第一个语句不正确时不会对第二个语句进行评估。通常,对输出无关紧要的语句求值是一种不必要的资源使用。
4) 最后,一般来说,您最好测试函数的输出,而不是测试其工作原理的内部结构。最好在传递数据的地方进行一堆测试,然后 expect
结果。