怎么写django测试意味着失败?

Ale*_*ird 47 testing django tdd

我有一个名为Thingwith called 的模型name,我希望name为char字段,只有 3个字符长.

我该怎么写测试?

class TestCase1(TestCase):
    def test1(self):
        thing = Thing(name='1234')
Run Code Online (Sandbox Code Playgroud)

那个测试应该失败.如何正确编写测试以便在该对象失败时测试通过

GDo*_*orn 91

如果你期望Thing(name ='1234')引发异常,有两种方法可以解决这个问题.

一种是使用Django的assertRaises(实际上来自unittest/unittest2):

def mytest(self):
    self.assertRaises(FooException, Thing, name='1234')
Run Code Online (Sandbox Code Playgroud)

除非Thing(name ='1234')引发FooException错误,否则会失败.另一种方法是捕获预期的异常并在没有发生的情况下引发异常,如下所示:

def mytest(self):
    try:
        thing = Thing(name='1234')
        self.fail("your message here")
    except FooException:
        pass
Run Code Online (Sandbox Code Playgroud)

显然,将FooException替换为您希望通过太长的字符串创建对象所获得的FooException.ValidationError?

第三个选项(从Python 2.7开始)是使用assertRaises作为上下文管理器,这使得代码更清晰,更易读:

def mytest(self):
    with self.assertRaises(FooException):
        thing = Thing(name='1234')
Run Code Online (Sandbox Code Playgroud)

遗憾的是,这不允许自定义测试失败消息,因此请妥善记录您的测试.有关更多详细信息,请参阅https://hg.python.org/cpython/file/2.7/Lib/unittest/case.py#l97.

  • `assertRaises`也可以在这样的with语句中使用:`with self.assertRaises(FooException):thing = Thing(name ='1234')` (2认同)

Aye*_*hik 7

在我之前的项目中,我必须做一些类似测试驱动开发的事情,所以我编写了一些测试用例,它必须捕获某些类型的错误。如果没有出现错误,那么我搞砸了一些东西。在这里我分享我的代码。

from django.test import TestCase
from django.contrib.auth.models import User

class ModelTest(TestCase):

def test_create_user_with_email(self):

    with self.assertRaises(TypeError):
        email = "ah@gmail.com"
        password = 'testpass1'

        user = User.objects.create_user(
            email = email,
            password = password,)

        self.assertEqual(user.email, email)
        self.assertTrue(user.check_password(password))
Run Code Online (Sandbox Code Playgroud)

您可以看到我尝试使用电子邮件和密码创建用户,但默认 Django 用户模型需要“用户名”和“密码”参数来创建用户。所以在这里我的测试用例必须引发“TypeError”。这就是我在这里尝试做的。


Chr*_*ris 6

我目前正在使用unittestexpectedFailure装饰器。这就像宣传的那样:没有错误时失败,失败时通过。

expectedFailure用来验证我的自定义断言例程确实有效,而不仅仅是橡皮图章一切正常。

import unittest
from django.test import TestCase

class EmojiTestCase(TestCase):

    @unittest.expectedFailure
    def testCustomAssert(self):
        self.assertHappyFace(':(') # must fail.
Run Code Online (Sandbox Code Playgroud)

但在测试期间打印警告消息。我将它与 Django 和 Nose 一起使用。这已经看到了。

/usr/lib64/python3.4/unittest/case.py:525: RuntimeWarning: TestResult 没有 addExpectedFailure 方法,报告为通过 RuntimeWarning)

我来这里是为了寻找更好的解决方案,但没有找到。所以我至少想告诉其他人,我一直在与之合作。