Django ModelForm и mock.patch.object ломают изоляцию тестового модуля? - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть модульный тест, который исправляет значение по умолчанию Django DateTimeField на известное значение.Этот тест проходит нормально, пока я не введу тест, который создает ModelForm на основе той же модели, после чего первоначальный тест начинает давать сбой:

Failure
Traceback (most recent call last):
  File "test_example.py", line 36, in test_init_date_missing
    self.assertEqual(actual.event_datetime, test_dt)
AssertionError: datetime.datetime(2019, 2, 27, 12, 20, 25, 69409) != datetime.datetime(2019, 2, 10, 10, 10, 10)

Тест проходит при запуске независимо от других, нокак только я пытаюсь запустить оба в одном наборе, это терпит неудачу.Это как если бы исправление завершилось неудачно, как только экземпляр формы был создан в другом тесте.

Этот пример кода демонстрирует проблему:

from datetime import datetime
from unittest import mock

from django import forms
from django.test import TestCase
from django.db import models
from django.utils import timezone


class MyExampleModel(models.Model):
    event_datetime = models.DateTimeField(default=timezone.now)


class MyExampleForm(forms.ModelForm):
    class Meta:
        model = MyExampleModel
        fields = ['event_datetime']


class ExampleTest(TestCase):
    def test_init_date_missing(self):
        """Tests that date is set automatically when not provided"""
        # Little bit of magic to mock the default value of a Django Field
        # Taken from https://stackoverflow.com/questions/18924869/mocking-default-timezone-now-for-unit-tests
        test_dt = datetime(2019, 2, 10, 10, 10, 10)
        event_datetime_field = MyExampleModel._meta.get_field('event_datetime')
        mock_tznow = mock.MagicMock(return_value=test_dt)

        with mock.patch.object(event_datetime_field, 'default', mock_tznow):
            actual = MyExampleModel()

        self.assertEqual(actual.event_datetime, test_dt)
        actual.save()  # The proof is in the pudding, will it actually save?


class ExampleFormTest(TestCase):
    def test_form(self):
        """Commenting out the below line causes ExampleTest.test_init_date_missing to pass
        Uncommmenting causes ExampleTest.test_init_date_missing to fail"""
        MyExampleForm()

Почему это происходит?И могу ли я что-нибудь сделать, чтобы эти тесты играли вместе?

...