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'.
我正在尝试用 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'.