Макет валидатора модельного поля в Джанго - PullRequest
0 голосов
/ 10 октября 2019

В соответствии с документацией к патчу для макетирования определенной функции. Мы должны смоделировать его из модуля, в котором он используется / вызывается.

a.py
def function_to_mock(x):
   print('Called function to mock')

b.py
from a import function_to_mock

def function_to_test(some_param):
    function_to_mock(some_param)

# According to the documentation 
#if we want to mock out function_to_mock in a
# test we have to patch it from the b.py module because that is where 
# it is called from

class TestFunctionToTest(TestCase):

    @patch('b.function_to_mock')
    def test_function_to_test(self, mock_for_function_to_mock):
        function_to_test()
        mock_for_function_to_mock.assert_called_once()

# this should mock out function to mock and the assertion should work

Я попал в ситуацию, когда не могу точно сказать, как смоделировать данную функцию. Вот ситуация.

# some application
validators.py
def validate_a_field(value):
    # do your validation here.

models.py
from . validators import validate_a_field

class ModelClass(models.Model):
      a_field = models.CharField(max_length=25, validators=[validate_a_field])

forms.py
class ModelClassModelForm(forms.ModelForm):
      class Meta:
           model = ModelClass
           fields = ['a_field',]

Finally in my tests.py
tests.py

class TestModelClassModelForm(TestCase):
      @patch('models.validate_a_field') <<< What to put here ???
      def test_valid_data_validates(self, validate_a_field_mock):
           data = {'a_field':'Some Text'}
           validate_a_field_mock.return_value = True

           form = ModelClassModelForm(data=data)
           is_valid = form.is_valid()
           validate_a_field_mock.assert_called_once() <<< This is failing

Из моего небольшого понимания, хотя validate_a_field вызывается в models.py. Он никогда не используется оттуда, когда происходит проверка. Поэтому, когда я исправляю как models.validate_a_field

, он не высмеивается, я думаю, что он вызывается где-то в django.forms.field. Но я не знаю, как и где.

Кто-нибудь знает, как решить эту проблему? Мне действительно нужно смоделировать validate_a_field, потому что он вызывает внешний API, что является скорее интеграционным тестом. Я хочу написать юнит-тест.

...