如何解决Django Model Mocking-更好地创建模型或模拟模型进行测试?
我有一个非常简单的模型,如下所示:
final
我正在尝试测试class Observation(models.Model):
thing = models.ForeignKey(Thing,on_delete=models.PROTECT)
user_locked = models.BooleanField(default=False)
admin_locked = models.BooleanField(default=False)
created = models.DateTimeField(auto_now=False,auto_now_add=True)
created_by = models.ForeignKey(
User,on_delete=models.PROTECT,related_name="%(class)s_created_by"
)
updated = models.DateTimeField(auto_now=True,auto_now_add=False)
updated_by = models.ForeignKey(
User,related_name="%(class)s_updated_by"
)
def is_fully_locked(self):
"""Return boolean if Observation is locked by both"""
if self.user_locked and self.admin_locked:
return True
return False
方法,并且对创建is_fully_locked()
模型感到好奇。
我过去曾经使用过Mixer和factory_boy之类的东西来创建要测试的对象,但是随着这些项目的发展,我想避免的测试运行时间也随之增加。我最近开始阅读有关使用Mock的文章(我对此仍然感到困惑)。
我的问题是-对于这样的简单模型-测试该方法的最佳/最快方法是什么?
目前,我有一些类似的测试:
Observation
我也很好奇-这些都是测试此问题的有效方法吗?我知道混合器方法有效-但它涉及数据库,我相信您应该避免使用它(这可能是为什么它最慢的原因)。
问题如下:
-
是否可以接受上述最快的方法进行测试?
-
这三个测试中的“最佳实践”是全部还是可以接受的?
-
通过模拟测试-我将如何编写该测试以通过(即我做错了什么)?
解决方法
我想所有这些方法都是可以接受的(但是,您可能不想像在test_is_fully_locked_with_no_employee_locked_mock中那样模拟要测试的对象-而是创建Observation
对象并模拟admin_locked
字段)。
我不确定您是否应该避免“触摸”数据库-Django测试运行器会为每次运行创建一个测试数据库。它有点慢,但是在某些情况下,这是测试代码的唯一方法。如果您可以摆脱内存中的对象(例如test_is_fully_locked_with_no_employee_locked测试),则可以加快测试速度。
模拟库通常用于模拟函数,例如,对外部服务器的请求,运行繁重的数据库查询,不确定性等,这些在测试环境中很难重现。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。