如何模拟Django Rest框架视图的get_对象方法?
我正在玩Django中FactoryBoy的如何模拟Django Rest框架视图的get_对象方法?,django,django-rest-framework,mocking,factory-boy,Django,Django Rest Framework,Mocking,Factory Boy,我正在玩Django中FactoryBoy的build(与create)方法相反。这将创建对象而不将其存储在数据库中 因此,为了使视图的测试能够正常工作,我需要修补接触数据库的方法 这里有一些代码 型号。py: class Book(models.Model): title = models.CharField(max_length=100) class BookSerializer(serializers.ModelSerializer): class Meta: model
build
(与create
)方法相反。这将创建对象而不将其存储在数据库中
因此,为了使视图的测试能够正常工作,我需要修补接触数据库的方法
这里有一些代码
型号。py:
class Book(models.Model):
title = models.CharField(max_length=100)
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = ('name')
class BookViewSet(viewsets.ModelViewSet):
def get_queryset(self):
return Book.objects.all()
def get_serializer_class(self):
return BookSerializer
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>
序列化程序。py:
class Book(models.Model):
title = models.CharField(max_length=100)
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = ('name')
class BookViewSet(viewsets.ModelViewSet):
def get_queryset(self):
return Book.objects.all()
def get_serializer_class(self):
return BookSerializer
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>
视图。py:
class Book(models.Model):
title = models.CharField(max_length=100)
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = ('name')
class BookViewSet(viewsets.ModelViewSet):
def get_queryset(self):
return Book.objects.all()
def get_serializer_class(self):
return BookSerializer
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>
测试。py:
class Book(models.Model):
title = models.CharField(max_length=100)
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = ('name')
class BookViewSet(viewsets.ModelViewSet):
def get_queryset(self):
return Book.objects.all()
def get_serializer_class(self):
return BookSerializer
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>
类BookFactory(factory.DjangoModelFactory):
标题=工厂伪造者(“句子”,nb_单词=4)
类元:
model=“Book”
def my_test():
client=APIClient()
books=BookFactory.build\u批量(10)
列表\ url=反向(“图书列表”)
使用patch.object(BookViewSet,“get\u queryset”,return\u value=books):
列表\ url=反向(“图书列表”)
response=client.get(列表\ url)
#这很有效
断言响应。内容=
使用patch.object(BookViewSet,“get_object”,return_value=books[0]):
详细信息\u url=reverse(“书籍详细信息”,args=123)
response=client.get(详细信息\u url)
#这个总是空的。。
assert response.content==
无论我尝试什么,细节视图总是返回空JSON。我是否使用了
patch
错误?在检索列表时(使用get\u queryset时),我遇到了相同的问题。您应该传递queryset作为返回值,而不是传递列表
books = BookFactory.build_batch(2)
queryset = MockSet(books[0], books[1])
queryset.model = Book # fix django-filter issue " TypeError: issubclass() arg 1 must be a class"
with patch.object(BookViewSet, "get_queryset", return_value=queryset):
# do your stuff here
为什么不使用该方法?如果您确定确实生成了书籍,可以尝试如下方式进行修补:patch('views.BookViewSet.get_queryset')。@bdbd-谢谢。我发现的问题是,
BookViewSet
的get\u queryset
方法已被覆盖,其中包括一些需要查询集(而不是列表)的调用,如prefetch\u related
等。