首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >assertRaises不会提高ValidationError

assertRaises不会提高ValidationError
EN

Stack Overflow用户
提问于 2019-10-18 02:40:34
回答 1查看 322关注 0票数 1

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

代码语言:javascript
复制
#tests.py
from django.core.exceptions import ValidationError

class SubmitProfileForm(TestCase):

    @classmethod
    def setUpTestData(cls):
        cls.data = {
            'email': 'test@email.com',
            '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())
代码语言:javascript
复制
# forms.py

class ProfileForm(ModelForm):

    class Meta:
        model = Profile
        fields = (
            'email', 'birth', 'coding_level', 'bio', 'github', 'avatar'
        )
代码语言:javascript
复制
# 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/")

实际结果:

代码语言:javascript
复制
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被捕获

EN

回答 1

Stack Overflow用户

发布于 2019-10-18 02:59:42

错误在内部引发,但却被Django捕获。只有在引发没有捕获的错误时,assertRaises才会触发。这类似于做以下事情:

代码语言:javascript
复制
def index_out_of_bounds():
    array = ["too", "short"]
    try:
        x = array[100]
    except IndexError:
        print("Error!")

index_out_of_bounds()

这将在方法中引发一个IndexError,但是由于捕获了它,这也不会触发assertRaises(IndexError)条件。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58443210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档