Django патч сохранить в unittest - PullRequest
0 голосов
/ 18 января 2019

В моем коде у меня есть игроки класса с методом 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 голосов
/ 18 января 2019

Вы пытаетесь смоделировать модуль 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 также может быть пользовательским менеджером .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...