在我的代码中,我的类播放器具有方法add_player:
class Players:
def __init__(self):
self.players = Player.objects.all()
self.active_player_index = 0
def add_player(self, player):
player.save()
在测试中,我试图这样做:
class PlayersTest(unittest.TestCase):
def setUp(self):
self.players = Players()
self.players.players = []
def fake_add_player(self, player):
self.players.players.append(player)
@patch.object(myproject.entities.Players, 'add_player', fake_add_player)
def test_add_players(self):
self.players.add_player(Player('player', 'blue', True))
self.assertEqual(len(self.players.players), 1)
运行此测试时,出现错误" AttributeError: <module 'riskgame.entities.Players' from '/entities/Players.py'> does not have the attribute 'add_player'
。此测试有什么问题?有更好的方法进行Django单元测试吗?
答案 0 :(得分:1)
您正在尝试模拟模块Players
,而不是类Players
。试试这个:
@patch.object(myproject.entities.Players.Players, 'add_player', fake_add_player)
一些不相关,不请自来的建议:
Players.py
的文件,其中包含类Player
。我希望该类驻留在entities
模块中(myproject/entities.py
而不是myproject/entities/Players.py
)。您的fake_add_players
已损坏。应该是:
def fake_add_player(self, player):
self.players.append(player)
在补丁播放器之后,self
是指Players
,而不是PlayersTest
。您可能希望将函数移出类,以避免混淆。
Players
类也可以是custom manager。