2016-12-28 38 views
0

我真的很努力地在測試驅動的基本骰子游戲中實現模擬對象。但是,當我運行我的測試(見下文)時,它顯示「AttributeError」,我只是沒有看到爲什麼?困難時間調試AttributeError:模塊'遊戲'沒有屬性'get_player_names'

這是我的單元測試(test_game.py)實現:

from unittest import TestCase, mock 

import game 

class GameTest(TestCase): 

    def test_get_player_names(self): 
     """Players can enter their names""" 

     fake_input = mock.Mock(side_effect=['A', 'M', 'Z', '']) 

     with mock.patch('builtins.input', fake_input): 
      names = game.get_player_names() 

     self.assertEqual(names, ['A', 'M', 'Z']) 

    def test_get_player_names_stdout(self): 
     """Check the prompts for player names""" 

     with mock.patch('builtins.input', side_effect=['A', 'B', '']) as fake: 
      game.get_player_names() 

     fake.assert_has_calls([ 
      mock.call("Player 1's name: "), 
      mock.call("Player 2's name: "), 
      mock.call("Player 3's name: ") 
     ]) 

這是在Python我的實際代碼(game.py):

class Dice: 

    def __init__(self, *players): 
     self.players = players 

    def get_players(self): 
     """Return a tuple of all players""" 
     return self.players 

    def get_player_names(): 
     """Prompt for player names""" 
     names = [] 

     while True: 
      value = input("Player {}'s name: ".format(len(names) + 1)) 
      if not value: 
       break 

      names.append(value) 

     return names 

錯誤顯示爲測試(PowerShell中):

PS C:\Users\Seun\desktop\dice> python -m unittest 

---------------------------------------------------------------------- 
Ran 0 tests in 0.000s 

OK 
PS C:\Users\Seun\desktop\dice> python3 -m unittest 
EE. 
====================================================================== 
ERROR: test_get_player_names (test_game.GameTest) 
Players can enter their names 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "C:\Users\Seun\desktop\dice\test_game.py", line 19, in test_get_player_names 
    names = game.get_player_names() 
AttributeError: module 'game' has no attribute 'get_player_names' 

====================================================================== 
ERROR: test_get_player_names_stdout (test_game.GameTest) 
Check the prompts for player names 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "C:\Users\Seun\desktop\dice\test_game.py", line 27, in test_get_player_names_stdout 
    game.get_player_names() 
AttributeError: module 'game' has no attribute 'get_player_names' 

---------------------------------------------------------------------- 
Ran 3 tests in 0.009s 

FAILED (errors=2)
+0

其中游戲初始化,你輸入的遊戲,但這裏是代碼? – depperm

+0

它的第二個代碼集 - game.py –

回答

0

通過game.get_player_names在你的測試班,你指着t ø

game.py但所謂的「get_player_names」 稱爲「遊戲」的模塊內的方法公開了一類Dice暴露get_player_names。所以你必須導入模塊,實例化一個Dice實例,然後從實例中調用get_player_names

from game import Dice 
class GameTest(TestCase): 
    # [ ... your code ...] 
    game = Dice('player1', 'player2') 
    game.get_player_names() # <== works. 

順便說一句,回溯是十分明瞭:AttributeError: module 'game' has no attribute 'get_player_names'模塊「遊戲」是重要的組成部分。

0

您的測試是導入名爲「遊戲」的module。 在這個模塊中,你有一個class(「Dice」)和「get_player_names」method

從錯誤消息中,您嘗試訪問如果來自錯誤的地方。 您需要首先實例化您的Dice類以訪問它的方法。

例如,您的GameTest裏面你可以有:

def test_get_player_names(self): 
    """Players can enter their names""" 

    fake_input = mock.Mock(side_effect=['A', 'M', 'Z', '']) 

    # Create a Dice Instance 
    dice_game = game.Dice() 

    with mock.patch('builtins.input', fake_input): 
     names = dice_game.get_player_names() # Reference to the Dice Instance and not the module 

    self.assertEqual(names, ['A', 'M', 'Z']) 
+0

我試過這個,但是它拋出一個TypeError:get_player_names()需要0個位置參數,但是1個被給出了 –

+0

啊,當然......我錯過了,你錯過了一個'self'該定義的參數(並且您可能希望這樣做,以便您可以將輸入保存在實例中)。 – pekapa

相關問題