Как передать контекст при тестировании удаления экземпляра? - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть пара моделей, Car и CertifyRequest.Когда экземпляр Car создан, изменен или удален , мне нужно создать CertifyRequest, который, в свою очередь, должен быть утвержден вручную.Экземпляр CertifyRequest содержит время, когда он был создан.

Я тестировал создание и изменение, вводя context={"now": …} в экземпляр CarSerializer, но я не могу понять, как сделать эквивалент, когдаудаление:

  1. Запросы на удаление никогда не передаются в сериализатор, поэтому я не могу получить доступ к контексту таким же образом.
  2. Я могу переопределить destroy в ModelViewSetи используйте get_serializer_context внутри него, но
    1. Я не могу передать сериализатор в экземпляр ModelViewSet, а
    2. реализация возвращает совершенно другой контекств любом случае.
  3. Я не хочу использовать ужасный хак, такой как необязательный параметр запроса или проверка того, что время "близко к" текущему времени клиента тестирования.

Хак, который я использую в настоящее время, состоит в том, чтобы установить дополнительное свойство now для Request, которое я передаю представлению, и искать его внутри destroy.

1 Ответ

1 голос
/ 23 апреля 2019

Если вы используете Django timezone.now() в своем представлении для получения текущего времени, вы можете смоделировать этот метод, чтобы он возвращал определенное время в ваших тестах и ​​утверждал против него.

def test_destroy_car():
    client = APIClient()
    @mock.patch("application.views.timezone.now") as now:
        destroy_time = datetime.datetime(2019, 4, 23, 11, 2, 0)
        now.return_value = destroy_time
        response = client.destroy("/api/car/12345/")
        assert response.status_code == status.HTTP_204_NO_CONTENT, "The request to delete did not return a 204 response"
        certify_request = CertifyRequest.objects.order_by("id").last()
        assert certify_request.created_at == destroy_time, "CertifyRequest destroy time is incorrect"
...