说我有以下内容:
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()
)。
我试着嘲笑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实例时可能会引发一些错误。