Python 使用pytest,当所述方法提示输入另一个输入并且处于连续循环中时,如何测试输入是否导致预期的方法调用?

Python 使用pytest,当所述方法提示输入另一个输入并且处于连续循环中时,如何测试输入是否导致预期的方法调用?,python,input,while-loop,pytest,Python,Input,While Loop,Pytest,通常用于测试方法是否对该输入具有预期响应。我们将使用monkeypatch这样的工具来实现这一点,然后我们将断言调用该方法将返回预期值 ,如果第二个具有可预测的返回值,则可以使用类似的方法 现在,如果该方法的预期行为是调用一个也请求输入的方法,该怎么办?目的是确保程序达到第二个输入提示(确认第一个输入具有预期结果)。有没有一种方法可以单独断言这一点 例如: class TwoInputs: def method_a(self): self.action = input(

通常用于测试方法是否对该输入具有预期响应。我们将使用monkeypatch这样的工具来实现这一点,然后我们将断言调用该方法将返回预期值

,如果第二个具有可预测的返回值,则可以使用类似的方法

现在,如果该方法的预期行为是调用一个也请求输入的方法,该怎么办?目的是确保程序达到第二个输入提示(确认第一个输入具有预期结果)。有没有一种方法可以单独断言这一点

例如:

class TwoInputs:

    def method_a(self):
        self.action = input("Enter something: ")
        if self.action == "jump":
            self.method_b()
            self.method_a()
        elif self.action == "exit":
            quit()

    def method_b(self):
        while True:
            self.action = input("Enter some other thing: ")
            if self.action == "1":
                print("Hello world.")
                break
            else:
                print("Invalid input.")

在上面的上下文中,如何测试方法a成功调用方法b,并在那里结束测试?如果我将monkeypatch输入更改为“跳跃”,然后简单地调用方法a,相同的输入将在方法b中被视为无效,然后将持续循环。

要检查方法b是否被调用,您必须模拟它。您还必须模拟
输入
,如您所述,并确保它返回的值将导致程序结束,而不是递归:

@mock.patch(“两个输入。两个输入。方法b”)
@mock.patch(“两个_输入.输入”)
@mock.patch(“两个_输入。退出”)
def test_,_a_调用_b(mock_quit,mock_input,mock_method_b):
#连续调用结果-第二个调用来自“方法a”内部`
mock_input.side_effect=[“跳转”、“退出”]
两个输入=两个输入()
两个_输入。方法_a()
mocked_方法_b.assert_调用了_once()
这假设类位于项目根目录下的
two_inputs.py

对于您的情况,我还添加了模拟系统函数
quit
(否则测试就会退出),尽管我猜您不会在实际代码中调用它