assertRaises不会引发ValidationError

问题描述 投票:1回答:1

测试传递了无效文件的ImageField时,Django断言没有引发任何[[ValidationError。这是在with self.assertRaises上下文中完成的。但是,当我访问form.errors.as_data()时,它表明ValidationError在技术上正在引发。我不清楚发生了什么。

#tests.py from django.core.exceptions import ValidationError class SubmitProfileForm(TestCase): @classmethod def setUpTestData(cls): cls.data = { 'email': '[email protected]', 'birth':'2019-01-01', 'coding_level': 'Hobbyist', 'bio': 'About me...', 'github': 'http://www.github.com', } cls.image = open(join(dirname(__file__), 'images/test_file.txt'), 'rb') cls.file = { 'avatar': SimpleUploadedFile( name=cls.image.name, content=cls.image.read() ) } def test_invalid_file_uploaded(self): with self.assertRaises(ValidationError): form = ProfileForm(self.data, self.file) form.errors print(form.errors.as_data())
# forms.py

class ProfileForm(ModelForm):

    class Meta:
        model = Profile
        fields = (
            'email', 'birth', 'coding_level', 'bio', 'github', 'avatar'
        )
# models.py

class Profile(models.Model):

    hobby = "Hobbyist"
    develop = "Developer"
    coding_level = (
        (hobby, hobby),
        (develop, develop)
    )

    user = models.OneToOneField(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE
    )
    email = models.EmailField()
    birth = models.DateField(verbose_name="Date Of Birth")
    coding_level = models.CharField(
        verbose_name="Experience",
        max_length=20,
        choices=coding_level, default=hobby, blank=False
    )
    bio = models.TextField(
        verbose_name="User Bio",
        validators=[MinLengthValidator(10, message="Add more to your bio!")]
    )
    github = models.URLField(
        verbose_name="GitHub link",
        validators=[check_submitted_link],
        unique=True
    )
    avatar = models.ImageField(upload_to="images/%Y/%m/%d/")
实际结果:

print(form.errors.as_data()) '''{'avatar': [ValidationError(['Upload a valid image. The file you uploaded was either not an image or a corrupted image.'])]} ''' AssertionError: ValidationError not raised

预期结果:捕获到ValidationError
python django
1个回答
0
投票
错误在内部引发,但被Django捕获。 assertRaises仅在引发未捕获的错误时才会触发。它类似于执行类似的操作:

def index_out_of_bounds(): array = ["too", "short"] try: x = array[100] except IndexError: print("Error!") index_out_of_bounds()

这将在方法内部引发IndexError,但是由于被捕获,因此也不会触发assertRaises(IndexError)条件。
© www.soinside.com 2019 - 2024. All rights reserved.