我正在编写一个单元测试,以确保正确创建了我的类对象,并且该对象依赖于从s3获取内容。我想模拟一下在其中完全调用s3的函数:

class SomeClassTest(unittest.TestCase):

    @patch('someDir.util._call_to_s3')
    def test_someclass_load(self, magic_mock):
        magic_mock.return_value = {"host": "bogus.com"}
        some_class = SomeClass()

        self.assertGreater(len(some_class), 0)

class SomeClass():

    def __init__():
        try:
            content = _call_to_s3(bucket_name, file_name)
        except:
            rest of code ...


如何模拟另一个库文件中定义的函数_call_to_s3?

最佳答案

猴子补丁时,您正在更改名称,使其指向不同的值。您不会更改值本身。关键是修补您要测试的设备正在使用的名称。

每次“从foo导入栏”执行操作时,都会创建一个新的本地名称副本。在这种情况下,SomeClass似乎不在someDir.util模块中。假设它在someDir.other_mod中

someDir.other_mod将执行类似“ from someDir.util import _call_to_s3”的操作。这将创建一个新名称someDir.other_mod._call_to_s3。那是SomeClass使用的名称,所以那是您需要修补的名称。

例如@patch('someDir.other_mod._call_to_s3')

无法修补每个指向特定值的名称。

09-05 08:06