Django补丁保存在unittest中

时间:2019-01-18 13:03:53

标签: python django unit-testing

在我的代码中,我的类播放器具有方法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单元测试吗?

1 个答案:

答案 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