Django FactoryBoy TestCase 处理嵌套对象创建

Django FactoryBoy TestCase handling nested object creation

我正在尝试用 django 编写 TestCase factory 并且这个 lill 位高级测试用例编写..

下面是我的models.py

class Author(models.Model):
    name = models.CharField(max_length=25)

    def __str__(self):
        return self.name

class Book(models.Model):
    author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='author')
    title = models.CharField(max_length=200)
    body = models.TextField()

    def __str__ (self):
        return self.title

下面是我的tests.py

from django.test import TestCase
from library.models import Author, Book
import factory

# Create factory for model
class AuthorFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = Author
    name = 'author name'

class BookFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = Book
    author = factory.SubFactory(AuthorFactory)
    title = 'i am title'
    body = 'i am body'


# Start TestCase here

class TestSingleBook(TestCase):
    def setUp(self):
        self.author = AuthorFactory.create_batch(
            10,
            name='Jhon Doe'
        )
        self.book = BookFactory.create_batch(
            author=self.author
        )

    def test_single_book_get(self):
        # compare here

以上代码,我的测试用例 class 是 class TestSingleBook(TestCase): 我希望你注意到它..

我想创建 10 个作者,并用这 10 个作者创建 10 本书,然后我将在 assertEqual

中进行比较

如果我与一位作者一起创作多本书,我可以很容易地制作测试,但我不想要它...

我的问题是Nested/Multiple...

创建多个作者,然后用这些作者创建多本书...

有没有人解决过这类问题?

在这种情况下,有人可以帮助我吗?如果你没有得到以上所有这些,请随时问我关于这个..

不太确定这是否是您想要的,因为我无法真正理解您要在测试用例中进行比较的内容。但是对于您创建 10 位作者和 10 本书的声明,进行此类创建的一种方法是简单地使用 for 循环:

self.author = AuthorFactory.create_batch(10, name='Jhon Doe')
for author in self.author:
    BookFactory.create(author=author)

当然这不会获得使用create_batch的效率。如果你仍然想使用 create_batch,你可以使用 django ORM 关系表示:

BookFactory.create_batch(
    10,
    author__name='Jhon Doe',
    title=<your title>,
    body=<your body>)

请注意,无需调用 AuthorFactory.create(),因为您已经将 author 声明为 BookFactory 中的 SubFactory。第二个代码将创建 10 个 Book 对象,其中包含 10 个不同的 Author 对象,并且所有 Author 对象都具有相同的名称 'Jhon Doe'.