Проверка правильности выбора модели в представлении DRF
У меня есть представление с конечной точкой get, которое определяет, какую модель использовать, глядя, содержит ли запрос параметр запроса "bla":
class FooView(APIView):
def get(self, request):
if "bla" in self.request.query_params:
model = ModelA
else:
model = ModelB
# ...
Теперь я хочу проверить это с помощью pytest. Приведенный ниже подход, похоже, работает. Правильно ли здесь использование method_calls? Тем не менее, это выглядит немного неуклюже.
@pytest.mark.django_db
def test_get_foo_correct_model_selection(client):
with mock.patch('path.to.ModelA.objects') as model_a_manager, mock.patch('path.to.ModelB.objects') as model_b_manager:
response = client.get(reverse("foo-list") + "?bla=true")
assert len(model_a_manager.method_calls) >= 1
assert len(model_b_manager.method_calls) == 0
# and now without bla param
with mock.patch('path.to.ModelA.objects') as model_a_manager, mock.patch('path.to.ModelB.objects') as model_b_manager:
response = client.get(reverse("foo-list"))
assert len(model_a_manager.method_calls) == 0
assert len(model_b_manager.method_calls) >= 1
Есть ли более элегантный способ?
Обычно я подражаю методу, который принимает ваш набор запросов или экземпляр модели в качестве параметра, а затем вы можете использовать:
# checks if method was called with correct param.
mocked_method.assert_called_with(correct_model)
В вашем примере можно использовать
model_a_manager.assert_called()
model_b_manager.assert_not_called()