Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Django测试中使用AssertRaiseMessage()_Python_Django_Unit Testing - Fatal编程技术网

Python 如何在Django测试中使用AssertRaiseMessage()

Python 如何在Django测试中使用AssertRaiseMessage(),python,django,unit-testing,Python,Django,Unit Testing,我遵循了使用AssertRaiseMessage()编写测试的步骤,但问题是在执行测试时引发了异常本身(因此,测试没有执行)。 请注意,调用的异常是我在模型的方法(而不是视图)中自愿提出的异常 我应该如何使用AssertRaiseMessage()让测试在不引发异常的情况下执行? 谢谢 编辑: 在尝试falsetru第一个解决方案后,问题仍然是一样的。只要我的测试进入resp=…部分,就会调用视图,然后调用相关的模型方法并引发异常。 完整堆栈跟踪: Traceback (most recent

我遵循了使用AssertRaiseMessage()编写测试的步骤,但问题是在执行测试时引发了异常本身(因此,测试没有执行)。 请注意,调用的异常是我在模型的方法(而不是视图)中自愿提出的异常

我应该如何使用AssertRaiseMessage()让测试在不引发异常的情况下执行? 谢谢

编辑: 在尝试falsetru第一个解决方案后,问题仍然是一样的。只要我的测试进入
resp=…
部分,就会调用视图,然后调用相关的模型方法并引发异常。 完整堆栈跟踪:

Traceback (most recent call last):
  File "/Users/walt/Code/hellodjango/clientizr/tests.py", line 338, in test_invertRewardState_view_fails_notmy_reward
    resp = self.client.get(reverse(invertRewardState, args=('1',)))
  File "/Users/walt/Code/hellodjango/venv/lib/python2.7/site-packages/django/test/client.py", line 473, in get
    response = super(Client, self).get(path, data=data, **extra)
  File "/Users/walt/Code/hellodjango/venv/lib/python2.7/site-packages/django/test/client.py", line 280, in get
    return self.request(**r)
  File "/Users/walt/Code/hellodjango/venv/lib/python2.7/site-packages/django/test/client.py", line 444, in request
    six.reraise(*exc_info)
  File "/Users/walt/Code/hellodjango/venv/lib/python2.7/site-packages/django/core/handlers/base.py", line 114, in get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/walt/Code/hellodjango/venv/lib/python2.7/site-packages/django/contrib/auth/decorators.py", line 22, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "/Users/walt/Code/hellodjango/clientizr/views.py", line 234, in invertRewardState
    reward.invert_reward_state(request.user)
  File "/Users/walt/Code/hellodjango/clientizr/models.py", line 606, in invert_reward_state
    self.throw_error_if_not_owner_reward(cur_user)
  File "/Users/walt/Code/hellodjango/clientizr/models.py", line 587, in throw_error_if_not_owner_reward
    raise Exception(EXC_NOT_YOURS)
Exception: Cet objet n'est pas le v\xf4tre

您可以使用
AssertRaiseMessage
作为上下文管理器来管理预期失败的代码:

class MyTestCase(TestCase):
    def test_invertRewardState_view_fails_notmy_reward(self):
        self.client.login(email='gislaine@toto.com', password='azerty')
        url = reverse(invertRewardState, args=(1,))
        with self.assertRaisesMessage(Exception, EXC_NOT_YOURS):
            self.client.get(url)

如果使用
self.client.get
,则不会直接获得异常,但可以检查状态代码

def test_invertRewardState_view_fails_notmy_reward(self):
    self.client.login(email='gislaine@toto.com', password='azerty')
    resp = self.client.get(reverse(invertRewardState, args=('1',)))
    self.assertEqual(resp.status_code, 500)
    self.assertIn(EXC_NOT_YOURS in resp.content)
如果要获取异常,请直接调用视图

def test_invertRewardState_view_fails_notmy_reward(self):
    request = HttpRequest()
    request.user = User.objects.create(email='gislaine@toto.com')  # login
    self.assertRaisesMessage(Exception, EXC_NOT_YOURS, invertRewardState, '1')

您可以按照Ned Batcheld的建议使用上下文管理器表单。

您希望从哪一部分获得解释
self.client.get()
?视图调用my models.py中引发异常的方法。我知道我在这里耦合东西(对于单元测试来说不是很好),但是我需要知道,如果传递给视图的arg(在我的示例中为“1”)不是登录用户拥有的对象,那么视图就不起作用。谢谢!关于我所说的bedfore,您认为更好的方法是只测试视图中的状态代码(即预期500),然后对模型进行另一个测试,并在这个测试中测试引发的异常吗?目的是避免耦合的东西。@DavidW.,我对此没有强烈的意见。实际上,我尝试了第一种解决方案,但它不起作用。执行测试时,
resp=client..
行引发异常:(@DavidW.,异常是什么?您能在某处发布完整的回溯吗?(不在注释中)异常是我在模型的一个方法中自动引发的。我更新了堆栈跟踪。如您所见,调用了视图,因此调用了我的模型方法,并且在逻辑上引发了异常。它是这样工作的。如果我只想测试HTTP代码响应,我需要在您的代码中更改什么(500?@DavidW。如果这个答案对你有效(已经一年多了),你不应该把它标记为已被接受吗?@NedBatchelder那太尴尬了。我读得太快了,我以为8月13日是2013年8月……时间戳中的13秒太多了。
def test_invertRewardState_view_fails_notmy_reward(self):
    request = HttpRequest()
    request.user = User.objects.create(email='gislaine@toto.com')  # login
    self.assertRaisesMessage(Exception, EXC_NOT_YOURS, invertRewardState, '1')