如何测试是否调用了Django QuerySet方法?

问题描述 投票:0回答:1

说我有以下内容:

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())。

python django django-queryset python-unittest
1个回答
0
投票

我试着嘲笑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实例时可能会引发一些错误。

© www.soinside.com 2019 - 2024. All rights reserved.