我是新来的,不熟悉编程(我才编程两周)。有没有人对如何测试不带参数的函数有什么建议。我测试过带参数的函数,但没有不带参数的函数
在test函数上,我尝试传递一个参数,该参数应为有效的_letter()函数中的字母“a”。但它给出了一个错误,即没有定义“a”
def valid_letter():
'''Function valid_letter
Parameters None
continuously asks for a valid letter
if invalid data is provided
'''
while True:
column = input("What column do you wish to select from a to g? ")
if column != "a" and column != "b" and\
column != "c" and column != "d" and\
column != "e" and column != "f" and\
column != "g" and column != "h":
print("Your input is invalid")
continue
else:
return column
break
def check_valid_column(expect):
answer = valid_letter()
print("Input: {}".format(answer))
print("Expected: {}, Actual {}".format(expect, answer))
def main():
check_valid_column(a)
main()
该函数将不带参数工作,并且仍然与用户输入相同,因为您在调用的函数中有input()
您调用
valid_letter()
的方式很好。这不是问题所在。但您打算验证输入是否为“a”(显然代表正确答案)因此,您不应该执行
check_valid_column(a)
,因为a
不是定义的变量,而是check_valid_column("a")
,字符“a”也是如此(注意:原来的函数由于缩进而被破坏,因此在我修复它时,我冒昧地重写了它以使其更简单。它的行为应与您预期的原始实现完全相同,并且测试策略(这是问题的真正焦点)与实现细节完全相同。)
一种方法是使用
patch
:测试中的
patch
语句将内置的input
函数替换为返回特定参数的Mock
对象。在第一个测试中,它只返回'a'
,因此我们断言valid_letter()
将返回相同的值。在第二个测试中,每次调用它时,它都会从列表中返回连续的值;我们断言valid_letter()
将继续在循环中调用它,直到它到达'g'
另一种方法是通过依赖项注入:
在本例中,它不是让
valid_letter
调用内置的input
函数,而是接受调用者提供的任意输入函数。如果你这样称呼它:然后,它的行为与原始的完全相同,但是调用方也可以传入任意替换,而不必使用
patch
。这使得测试更加容易,而且它还允许调用方包装或替换input
以允许不同的UI样式。例如,如果在GUI应用程序中使用此函数,则调用方可以传递一个input_func
,通过对话框而不是终端提示用户相同的测试/注入逻辑适用于
print
函数。您可能会发现,让您的测试验证print
在每次输入无效值时被调用是有用的,而另一个调用方可能会发现使用替代输出函数是有用的相关问题 更多 >
编程相关推荐