【问题标题】:In Python3, how do you test exception handling within a unit test? [duplicate]在 Python3 中,如何在单元测试中测试异常处理? [复制]
【发布时间】:2019-11-04 18:22:48
【问题描述】:

我正在为一个 api 进行几个单元测试。测试使用 @patch 来模拟 api 调用。我希望创建的一些测试应该触发异常。如何在单元测试中处理它?

这是我目前所拥有的。 Pylint 抱怨 assertTrue() 语句。我确信有更好的方法来处理异常。

@patch('myapi.myapi.requests.request')
def test_auth_failure(self, mock_request):
    # Configure the request mock to return an auth failure
    # Auth/login (/session) failures return status 200, but without a token!
    mock_request.return_value.status_code = 200
    mock_request.return_value.content = json.dumps(self.mock_auth_failure)
    try:
        # Call auth()
        self.api.auth()
        # Exception should have been raised
        self.assertTrue(False)
    except exceptions.HTTPUnauthorized:
        # Exception caught
        self.assertTrue(True)

附加信息:这是在从 unittest.TestCase 扩展的类中。示例:

 class MyApiTests(unittest.TestCase):

【问题讨论】:

  • 您在代码中遗漏了',请修复它
  • 这也是单元测试吗?

标签: python python-3.x


【解决方案1】:

如果您使用的是 pytest,那么它的功能...

import pytest


def test_zero_division():
    with pytest.raises(ZeroDivisionError):
        1 / 0

https://docs.pytest.org/en/latest/assert.html#assertions-about-expected-exceptions

【讨论】:

  • 这样更干净。希望我有不止一票。
【解决方案2】:

如果您的类(定义了 test_auth_failure 方法)扩展了unittest.TestCase,您应该使用[Python 3.Docs]: unittest - assertRaises(exception, callable, *args, **kwds)

将您的 try / except 子句替换为:

with self.assertRaises(exceptions.HTTPUnauthorized):
    self.api.auth()

self.assertRaises(exceptions.HTTPUnauthorized, self.api.auth)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    相关资源
    最近更新 更多