我是进行单元测试的新手。我目前正在运行 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)
这里有一个例子来展示你哪里出错了,为了解释的目的,我将 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