1

我正在测试我与 Sanic 一起使用的验证功能。

def validate(val):
    try:
        if isinstance(val, bool):  # Here because the int(val) line will success with int(True)/int(False)
            raise ValueError()
        if isinstance(val, float):
            print("IT'S FLOAT!")
            raise ValueError()
        if '.' in str(val):
            raise ValueError()
        n = int(val)
    except ValueError as ex:
        raise InvalidUsage('Invalid value "{}" for int param "n"'.format(val))

我正在针对浮点值对此进行测试,并使用假设来生成测试条件。

@given(val=st.floats())
def test_validate_int_float(val):
    with pytest.raises(InvalidUsage) as ex:
        validate(val)
    print("{}|{}|{}".format(ex.value, f'Invalid value "{val}" for int param "n"',
                            ex.value == f'Invalid value "{val}" for int param "n"'))
    assert ex.match(f'Invalid value "{val}" for int param "n"')

此测试失败:

Falsifying example: test_validate_int_float(val=1e+16)

打印语句如下所示:

IT'S FLOAT!
Invalid value "1e+16" for int param "n"|Invalid value "1e+16" for int param "n"|False

为什么我的断言不匹配?琴弦在我看来是一样的。我假设这是由于浮点值,但在这种情况下,我如何正确匹配该值?

4

2 回答 2

1

ex.value在检查相等性之前将 转换为 str :

print("{}|{}|{}".format(ex.value, f'Invalid value "{val}" for int param "n"',
                        str(ex.value) == f'Invalid value "{val}" for int param "n"'))
于 2019-10-15T18:09:29.213 回答
0

什么版本的 pytest 和 Python?我很确定这是一个 pytest 使用问题,与假设无关。

虽然不是答案,但在返回的东西上使用match 参数pytest.raises不是方法通常更容易阅读,我怀疑不会有同样的问题。

于 2019-10-16T12:13:55.400 回答