2017-01-23 72 views
0

这里是一个的给错误/ falure方法:RSPEC调用方法错误

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?方法,我叫他们!作为“if”条件的

所以我在哪里出错

非常感谢帮助!

我目前在学习Ruby。

回答

1

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?回报false。这是由于short circuiting。在所有语句都必须评估为真(或假)的情况下,一旦其中一个没有,其余的不会被评估。想想一个例子:if user != nil && user.admin?。你想要在这里短路,以便第二个语句不被评估,如果第一个不是真的。一般来说,这是一种不必要的资源使用来评估输出无关紧要的语句。

4)最后,一般来说,你最好测试函数的输出,而不是测试它的工作内部。最好有一堆测试,你传递数据,然后结果。

+0

我忘了短路,谢谢!这是我正在经历的在线课程的一部分,我不应该触摸测试,但测试该功能的输出确实更有意义!虽然Rspec运作良好,但对于我为一个井字游戏制作的整体CLI而言,Rspec仍然会引发错误。所以我继续前进。真的很感激这个信息! – Edson