0

我有一个函数,其中包含以下代码

ses = boto3.Session()
as_role = aws_assume_role_lib.assume_role(session, "some_role")

我正在尝试对其进行单元测试,我需要模拟这两个调用。最好的方法是什么?

4

1 回答 1

0

没有更多信息,就无法回答您的问题。任何直接的答案都需要更多的信息。你想测试什么?它当然不可能是您向我们展示的代码,因为如果您模拟出这两个调用,就没有什么可测试的了。

模拟涉及为特定测试用例注入替代,这样对于这些测试用例,模拟返回预定值而不调用实际例程。那么您希望这些值是什么?模拟也可能有副作用,或者根据外部状态改变它们的行为,但你想尽量避免这些情况。模拟通常是功能性的......为每组特定的显式输入返回一个特定的输出,并且既不修改也不受到隐式(外部)状态的影响。

我认为ses应该是session这样,以便将第一次调用的结果传递给第二次调用。在这种情况下,这些调用都不会使用不同的数据,因此您可以通过将静态值分配给as_role...来模拟这两个调用的结果......您以后的代码想要看到的任何值。由于只有一组输入,因此应该只有一个可能的输出。

如果您需要模拟根据外部状态更改其行为,那将更加复杂。在这种情况下你如何模拟完全取决于可能的外部状态,它们来自哪里,以及它们如何影响as_role. 同样,如果你需要你的模拟来改变外部状态,比如修改全局变量,你需要指定它,这可能会影响你选择模拟的方式。

简而言之,您应该定义一个规范来描述您希望您的模拟如何在一组受限的特定条件下运行。拥有该规范将使您开始决定如何实施它们。

如果您只是询问如何在 Python 中构建模拟,请查看一个或多个现有的 Python 模拟框架,例如mock, flexmock, mox,Mocker等。快速谷歌向我指出了这一点,这可能会有所帮助: https:// garybernhardt.github.io/python-mock-comparison/。要求图书馆推荐是违反 SO 政策的,因为它主要涉及个人意见,所以如果您要求这样做,您应该寻找其他地方。

于 2022-01-28T04:11:22.903 回答