【问题标题】:Python Django Test for One of Two ExceptionsPython Django 测试两个异常之一
【发布时间】:2019-02-13 20:11:54
【问题描述】:

我正在尝试测试模型的某个实例是否会引发两个异常之一,但我不知道如何让它工作。这是我所拥有的:

型号

class AvailablePermissions(models.Model):
    # Main Checkbox.
    category = models.CharField(
        max_length=100,
    )
    # Checkboxes under Main Checkbox.
    subcategory = models.CharField(
        max_length=100,
    )
    # The view to grant permission to.
    view_name= models.CharField(
        max_length=255,
        unique=True,
    )

    def full_clean_save(self):
        try:
            name = resolve(reverse(f'{self.view_name}'))
            self.full_clean()
            self.save()
        except NoReverseMatch as nrme:
            raise nrme
        except ValidationError as ve:
            raise ve
        return self

测试

# Default permission object "(**permission)"
permission = {
            'category': 'Category',
            'subcategory': 'Subcategory',
            'view_name': 'employee:create_profile',
            }
available_permission = AvailablePermissions(**permission)

class AvailablePermissionsValidationTest(TestCase):

    def test_AvailablePermissions_will_not_save_blank_permissions(self):
        for field in permission:
            original_value = permission[field]
            permission[field] = ''

            with self.assertRaises(ValidationError or NoReverseMatch):
                AvailablePermissions(
                    **permission
                ).full_clean_save()

            permission[field] = original_value

它会引发NoReverseMatch 错误,但我不知道如何查找“非此即彼”异常。

【问题讨论】:

    标签: python django unit-testing python-unittest django-unittest


    【解决方案1】:

    这可能有效:

    with self.assertRaises(ValidationError):
        try:
            AvailablePermissions(
                **permission
            ).full_clean_save()
        except NoReverseMatch:
            raise ValidationError 
    

    但你真的想这样做吗?通常,单元测试的愿望是练习所有可能的路径。这只会保证测试两条路径之一。

    【讨论】:

    • 也许不是?你会推荐什么?顺便说一句,我不得不向ValidationError('NoReverseMatch Error')添加一条消息
    • 通常最好对每种错误类型使用两个不同的测试,然后弄清楚如何独立地激发错误。因此,在这种情况下,注入一个 view_name 会导致每个测试出现相应的错误。
    • def test_AvailablePermissions_only_saves_if_view_exists(self): - 为了通过这个测试,我打破了上面的测试,无法弄清楚如何只用少量代码重写它。
    猜你喜欢
    • 2019-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-18
    • 1970-01-01
    • 1970-01-01
    • 2013-10-30
    • 2023-02-06
    相关资源
    最近更新 更多