微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

pytest:如何干燥类似的模型管理器方法测试 经理和模型工厂测试

如何解决pytest:如何干燥类似的模型管理器方法测试 经理和模型工厂测试

我有什么

经理和模型

有了经理,我可以得到那些已实现,人为制造或已规定的案件。

from datetime import date

class CaseManager(models.Manager):
    """Define a manager for Case model."""

    def fulfilled(self):
        """Get all cases that will fulfill soon."""
        return self.get_queryset().filter(fulfillment=date.today())

    def caducated(self):
        """Get all cases that will caducate soon."""
        return self.get_queryset().filter(caducity=date.today())

    def prescribed(self):
        """Get all cases that will prescribe soon."""
        return self.get_queryset().filter(prescription=date.today())

class Case(models.Model):
    """Representation of a legal case."""

    fulfillment = models.DateField(verbose_name=_("Fulfillment"),default=date.today)
    caducity = models.DateField(verbose_name=_("Caducity"),default=date.today)
    prescription = models.DateField(verbose_name=_("Prescription"),default=date.today)

    objects = CaseManager()

工厂

创建假案进行测试。

class CaseFactory(DjangoModelFactory):
    """Define Case Factory"""

    fulfillment = Faker("date")
    caducity = Faker("date")
    prescription = Faker("date")

    class Meta:
        model = Case

我尝试过的事情

测试

class TestCasesManagers:
    def test_fulfilled(self):
        case = CaseFactory(fulfillment=date.today())
        assert case in Case.objects.fulfilled()

    def test_caducated(self):
        case = CaseFactory(caducity=date.today())
        assert case in Case.objects.caducated()

    def test_prescribed(self):
        case = CaseFactory(prescription=date.today())
        assert case in Case.objects.prescribed()

问题

使用这种方法,我必须对管理器中所有相似且不可扩展的方法重复几乎相同的测试。

我想要什么

  1. 创建cases并更改传递给工厂的关键字args以创建假模型。
  2. assert调用管理器的不同方法,而无需重复相同的代码

解决方法

您可以使用对象列表来概括这些内容:

class TestCasesManagers:
    kws = [
        ('fulfillment','fulfilled'),('caducity','caducated'),('prescription','prescribed')
    ]

    def make_test(ky,mg):
        def f(self):
            case = CaseFactory(**{ky: date.today()})
            assert case in getattr(Case.objects,mg)()
        return f
    for ky,mg in kws:
        locals()[f'test_{mg}'] = make_test(ky,mg)
    del make_test

因此,您可以轻松地向列表kws添加一个额外的2元组来测试此组合。这些仍然是单个测试,因此您可以决定仅运行管理器功能中的一个测试,或仅重试失败的功能。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。