python - 即使引发 ValueError,Pytest assertRaisesWithMessage(ValueError) 也会失败

标签 python pytest

pytest 测试套件在两个测试中失败,即使出现了值错误,并且我已经放置了打印以确保条件被激活,有人知道这两个测试失败了吗?

代码

import string

class PhoneNumber:
    def __init__(self, number):
        self.number = ''.join([el for el in number if el in string.digits])
        
        if len(self.number) <= 9 or len(self.number) > 11:
            raise ValueError('Number length is incorrect')
        elif len(self.number) == 11:
            if self.number.startswith('1'):
                self.number = self.number[1::]
                if self.number.startswith('0') or self.number.startswith('1'):
                    print('+++ This fires +++')
                    raise ValueError('Incorrect area code')
            else:
                raise ValueError('Number does not start with 1')
        elif self.number[0] == '0' or self.number[0] == '1':
            raise ValueError('Incorrect area code') 
        elif self.number[3] == '0' or self.number[3] == '1':
            raise ValueError('Incorrect exchange code')

    def area_code(self):
        return self.number[:3]
    
    def pretty(self):
        return '('+ self.number[:3] +') ' + self.number[3:6] + '-' + self.number[6::]

PhoneNumber("1 (023) 456-7890")

测试

def test_invalid_if_area_code_starts_with_0_on_valid_11_digit_number(self):
        with self.assertRaisesWithMessage(ValueError):
            PhoneNumber("1 (023) 456-7890")

def test_invalid_if_area_code_starts_with_1_on_valid_11_digit_number(self):
        with self.assertRaisesWithMessage(ValueError):
            PhoneNumber("1 (123) 456-7890")

在测试套件之外运行代码时的输出

+++ This fires +++
Traceback (most recent call last):
  File "Exercism/python/phone-number/phone_number.py", line 28, in <module>
    PhoneNumber("1 (023) 456-7890")
  File "Exercism/python/phone-number/phone_number.py", line 14, in __init__
    raise ValueError('Incorrect area code')
ValueError: Incorrect area code

Pytest 输出

=========================================================================== FAILURES =========================================================================== 
_____________________________________ PhoneNumberTest.test_invalid_if_exchange_code_starts_with_0_on_valid_11_digit_number _____________________________________ 

self = <phone_number_test.PhoneNumberTest testMethod=test_invalid_if_exchange_code_starts_with_0_on_valid_11_digit_number>

    def test_invalid_if_exchange_code_starts_with_0_on_valid_11_digit_number(self):
        with self.assertRaisesWithMessage(ValueError):
>           PhoneNumber("1 (223) 056-7890")
E           AssertionError: ValueError not raised

phone_number_test.py:75: AssertionError
_____________________________________ PhoneNumberTest.test_invalid_if_exchange_code_starts_with_1_on_valid_11_digit_number _____________________________________ 

self = <phone_number_test.PhoneNumberTest testMethod=test_invalid_if_exchange_code_starts_with_1_on_valid_11_digit_number>

    def test_invalid_if_exchange_code_starts_with_1_on_valid_11_digit_number(self):
        with self.assertRaisesWithMessage(ValueError):
>           PhoneNumber("1 (223) 156-7890")
E           AssertionError: ValueError not raised

phone_number_test.py:79: AssertionError
=================================================================== short test summary info ==================================================================== 
FAILED phone_number_test.py::PhoneNumberTest::test_invalid_if_exchange_code_starts_with_0_on_valid_11_digit_number - AssertionError: ValueError not raised       
FAILED phone_number_test.py::PhoneNumberTest::test_invalid_if_exchange_code_starts_with_1_on_valid_11_digit_number - AssertionError: ValueError not raised       
================================================================= 2 failed, 19 passed in 0.78s =================================================================

最佳答案

您正在使用 assertRaisesWithMessage,这不是 unittest.TestCase 中的默认方法,但我假设它需要一条消息,默认为空字符串。由于您未提供消息,因此检查失败。

如果您想使用标准unittest方法,您可以使用:

def test_invalid_if_area_code_starts_with_0_on_valid_11_digit_number(self):
    with self.assertRaises(ValueError):
        PhoneNumber("1 (023) 456-7890")

或者,如果您想要测试消息:

def test_invalid_if_area_code_starts_with_0_on_valid_11_digit_number(self):
    with self.assertRaisesRegex(ValueError, "Incorrect area code"):
        PhoneNumber("1 (023) 456-7890")

话虽如此,看起来您正在混合 unittestpytest。虽然这是可能的,但我建议不要这样做,除了旧的 unittest 代码。

使用pytest,测试将如下所示:

def test_invalid_if_area_code_starts_with_0_on_valid_11_digit_number(self):
    with pytest.raises(ValueError):
        PhoneNumber("1 (023) 456-7890")

def test_invalid_if_area_code_starts_with_0_on_valid_11_digit_number(self):
    with pytest.raises(ValueError, match="Incorrect area code"):
        PhoneNumber("1 (023) 456-7890")

关于python - 即使引发 ValueError,Pytest assertRaisesWithMessage(ValueError) 也会失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62373798/

相关文章:

python - 如何在 python 中为具有不同类型值的字典添加类型声明

python - 能够使用 ffmpeg 和 python 读取当前音频帧

sprintf 的 Python 等价物

python - 一般如何创建仅测试 Django 模型(特别是使用 pytest-django)

python - Pandas groupby 转置

python - 将 Python 模块导入 AWS Lambda

python - 如何始终为使用 PyTest 测试的 Flask 应用程序提供上下文?

python - 关键 - 在 Travis CI 中运行时出错| pytest

python - 如何使用命令行在pytest中传递多个参数?

python - 如何在没有函数的脚本上使用 pytest