Как проверить, был ли вызван метод Django QuerySet? - PullRequest
0 голосов
/ 29 марта 2019

Скажите, что у меня есть следующее:

models.py:

class FooQuerySet(models.QuerySet):

    def bar(self):
        return self.filter(...)


class Foo(models.Model):
    ...

    objects = models.Manager.from_queryset(FooQuerySet)

views.py:

class FooListView(ListView):
    model = Foo

    def get_queryset(self):
        qs = super().get_queryset()

        return qs.bar()

И я хочу проверить, что models.FooQuerySet.barвызывается, когда вызывается представление.

Пока у меня есть:

request = RequestFactory().get('')
view = FooListView.as_view()

with mock.patch('<best_guess>') as mocked:
    mocked.return_value = Foo.objects.none()
    view(request)
    mocked.assert_called_once()

Где <best_guess> было:

  • foo_app.models.FooQuerySet.bar
  • foo_app.models.Foo.objects.bar
  • foo_app.views.Foo.objects.bar

Ни один из которых не работал.Даже если бы я наткнулся на волшебную заплатку, которая сработала , я боюсь, что просто не понимаю, что здесь происходит.Каков правильный способ проверки того, что FooQuerySet.bar() называется?

(Существует также дополнительная сложность, связанная с QuerySets, поэтому мне, возможно, однажды понадобится узнать, вызывается ли FooQuerySet.any().amount().of().weird().methods().bar()).

1 Ответ

0 голосов
/ 29 марта 2019

Я бы попытался высмеять ListView.get_queryset и оставить его как MagicMock, например ::

with mock.patch("foo_app.views.ListView.get_queryset") as mocked:
    view(request)
    mocked.bar.assert_called_once()

А затем для длинных цепочек обратных вызовов просто используйте:

mocked.bar.return_value.any.return_value.amount.return_value.of.assert_called_once()
...

Однако помните, что если представление зависит от возвращаемого QuerySet, оно может вызвать некоторые ошибки при представлении с экземпляром MagicMock.

...