Инсценировка запроса к цепочке БД в модульном тесте Django
У меня есть функция, которая позволяет пользователям создавать новую запись в БД. Но перед этим у меня была проверка, не являются ли существующие записи пользователя меньше допустимого диапазона. Ниже приведена реализация функции
def is_allowed_to_create(permissible_range):
count = MyModel.objects.filter(query)[:permissible_range].count()
return not count >= permissible_range
Внутри тестового файла я делаю
@mock.patch('MyApp.models.MyModel.objects')
def test_is_allowed_to_create(self, mock_qs, *args, **kwargs):
mock_qs.filter.return_value = mock_qs
mock_qs.count.return_value = 10
self.assertTrue(is_allowed_to_create(5))
И ошибка, которую я получаю, следующая
TypeError: '>=' not supported between instances of 'MagicMock' and 'int'
.
Как я понял из ошибки, мой код не устанавливает правильное возвращаемое значение для всего запроса DB, т.е. MyModel.objects.filter(query)[:permissible_range].count()
. Как я могу установить издевательское значение для MyModel.objects.filter(query)[:permissible_range].count()
как целое число.
Спасибо!
Я внес изменения в свою тестовую функцию, так как я использую slicing
, которая внутренне вызывает метод __getitems__
, поэтому мне нужно поиздеваться и над ним
Вот обновленный код
@mock.patch('MyApp.models.MyModel.objects')
def test_is_allowed_to_create(self, mock_qs, *args, **kwargs):
mock_qs.filter.return_value = mock_qs
mock_qs.__getitems__.return_value = mock_qs
mock_qs.count.return_value = 10
self.assertTrue(is_allowed_to_create(5))