【发布时间】:2018-09-10 16:33:11
【问题描述】:
我正在使用 Django 中 FactoryBoy 的 build(而不是 create)方法。这会创建对象而不将它们存储在数据库中。
因此,为了使我的视图测试能够正常工作,我需要修补涉及数据库的方法。
这里有一些代码......
models.py:
class Book(models.Model):
title = models.CharField(max_length=100)
serializers.py:
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = ('name')
views.py:
class BookViewSet(viewsets.ModelViewSet):
def get_queryset(self):
return Book.objects.all()
def get_serializer_class(self):
return BookSerializer
tests.py:
class BookFactory(factory.DjangoModelFactory):
title = factory.Faker('sentence', nb_words=4)
class Meta:
model = "Book"
def my_test():
client = APIClient()
books = BookFactory.build_batch(10)
list_url = reverse("books-list")
with patch.object(BookViewSet, "get_queryset", return_value=books):
list_url = reverse("books-list")
response = client.get(list_url)
# this works
assert response.content = <a list of books>
with patch.object(BookViewSet, "get_object", return_value=books[0]):
detail_url = reverse("books-detail", args=123)
response = client.get(detail_url)
# this is always empty..
assert response.content == <a book>
无论我尝试什么,详细视图总是返回空 JSON。我是不是用错了patch?
【问题讨论】:
-
你为什么不用mentioned here的方法?
-
如果您确定书籍确实已构建,您可以尝试像这样修补它:patch('views.BookViewSet.get_queryset')。
-
@bdbd - 谢谢。我发现的问题是
BookViewSet的get_queryset方法已被覆盖,并且包括一些需要查询集(而不是列表)的调用,例如prefetch_related等。
标签: django django-rest-framework mocking factory-boy