类型错误:<lambda>() 需要 0 个位置参数,但由于在测试中对“输入”进行猴子修补而给出了 1 个

问题描述 投票:0回答:1

我是进行单元测试的新手。我目前正在运行 pytest。我正在运行这个

Program.py
,但是当我在我的
Test_Program.py
上运行 pytest 时,由于这些类型错误,我的测试失败了,我在下面的代码中设置了断言行。我让程序询问用户输入值或输入退出程序。我的
import pytest
已包含在我的
Test_BMI.py
计划中。

我想也许猴子补丁是我的问题的原因。我已经尝试过

self
作为参数,但它不起作用。我使用
lambda
错了吗?我不确定如何最好地解决这个问题并让这些用户输入发挥作用。这只是测试用户的
get_weight
功能。

这里有一个错误:

这是从 test_BMI.py 运行 pytest

 _____________________ test_get_weight_returns_valid_input ______________________

monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x105036128>

def test_get_weight_returns_valid_input(monkeypatch):
    with monkeypatch.context() as context:
        context.setattr('builtins.input', lambda: "131")
    >   assert BMI.get_weight() == 131

这是来自我的 BMI.py 程序:

def get_weight():
    """ Prompts user to enter weight

    Args:

    Returns:
        float: weight in lbs or None if no weight is entered.

    Exits:
        ValueError: If weight is not a positive integer.
        ValueError: If weight is equal to zero or not an integer value.


    """
    while True:
        try:
    >   pounds = input("\nEnter Weight (in lbs) or press <Enter> to quit: ")
    E   TypeError: <lambda>() takes 0 positional arguments but 1 was given

这是

get_weight
的其余功能:

        if float(pounds) in range(1, 999):
            return pounds
        elif pounds == 0:
            print("Weight must be between 1 and 999.")
            print("ValueError: '%.2f' is invalid." % pounds)
        else:
            raise ValueError

    except ValueError:
        if pounds == '':
            return None
        else:
            print("Weight must be a floating value between 1 and 999.")
            print("ValueError: '%s' is invalid." % pounds)
python python-3.x unit-testing pytest
1个回答
27
投票

这里有一个例子来展示你哪里出错了,为了解释的目的,我将 lambda 分配给变量:

zero_arg_lambda = lambda: "131"  # Takes no args
one_arg_lambda = lambda x: "131"  # Takes one arg

使用arg调用zero_arg_lambda(与你的错误相同):

zero_arg_lambda(1)
>>> Traceback (most recent call last):
>>> File "<input>", line 1, in <module>
>>> TypeError: <lambda>() takes no arguments (1 given)

调用 one_arg_lambda :

one_arg_lambda(1)
>>> "131"

简而言之,即使您已指定它不接受参数,您的代码也会向 lambda 传递一个参数。

one_arg_lambda 示例接受一个参数并简单地将值返回到冒号右侧。 我建议阅读 lambda

上的文档

或者如果你不看那里,预期的 lambda 格式是:

lambda 参数:表达式

另请注意 monkeypatch.context.setattr 上的文档,其中有一个使用 lambda 表达式的好示例。

要确定代码中的错误来自测试中的 context.setattr 调用。

def test_get_weight_returns_valid_input(monkeypatch):
    with monkeypatch.context() as context:
        # Old line causing error: context.setattr('builtins.input', lambda: "131")
        context.setattr('builtins.input', lambda x: "131")  # Fixed 
© www.soinside.com 2019 - 2024. All rights reserved.