2017-01-23 112 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