【问题标题】:How to mock the get_object method of a Django Rest Framework view?如何模拟 Django Rest Framework 视图的 get_object 方法?
【发布时间】: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 - 谢谢。我发现的问题是BookViewSetget_queryset 方法已被覆盖,并且包括一些需要查询集(而不是列表)的调用,例如prefetch_related 等。

标签: django django-rest-framework mocking factory-boy


【解决方案1】:

我在检索列表时遇到了同样的问题(使用 get_queryset 时)。您应该将查询集作为 return_value 传递,而不是传递一个列表。

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

【讨论】:

    猜你喜欢
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    • 2020-04-23
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    • 1970-01-01
    • 2014-10-27
    相关资源
    最近更新 更多