如何模拟Django Rest框架视图的get_对象方法?

如何模拟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

我正在玩Django中FactoryBoy的
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
等。