在python中,如何操作实例的名称空间

在python中,如何操作实例的名称空间,python,Python,这个问题是在单元测试的背景下提出的。 我已经创建了一个我正在测试的类的实例,并尝试测试它的一个方法。该方法使用从单独模块中定义的不同类获取的数据。我将模拟那个模块。 如何访问实例的名称空间-在运行我正在测试的方法之前,我必须这样做,以模拟包含我的方法从中获取数据的类的定义的模块?我将在这里创建一个示例,我认为它与您尝试的操作类似 假设您有一个类,我们将调用模块foo中定义的Data。foo模块导入bar,并且foo.Data方法调用bar.get_Data()来填充自身 您希望创建一个模块tes

这个问题是在单元测试的背景下提出的。 我已经创建了一个我正在测试的类的实例,并尝试测试它的一个方法。该方法使用从单独模块中定义的不同类获取的数据。我将模拟那个模块。
如何访问实例的名称空间-在运行我正在测试的方法之前,我必须这样做,以模拟包含我的方法从中获取数据的类的定义的模块?

我将在这里创建一个示例,我认为它与您尝试的操作类似

假设您有一个类,我们将调用模块
foo
中定义的
Data
foo
模块导入
bar
,并且
foo.Data
方法调用
bar.get_Data()
来填充自身

您希望创建一个模块
test
,该模块将创建
foo.Data
的实例,但不使用实际的模块
bar
,而是希望该实例使用模拟版本

您可以通过从测试模块导入
foo
,然后将
foo.bar
重新绑定到模块的模拟版本来设置此设置。

下面是一个示例,说明了这可能是什么样子:

  • bar.py:

    def get_data():
        return 'bar'
    
  • foo.py:

    import bar
    
    class Data(object):
        def __init__(self):
            self.val = bar.get_data()
    
    if __name__ == '__main__':
        d = Data()
        print d.val    # prints 'bar'
    
  • test.py:

    import foo
    
    class bar_mock(object):
        @staticmethod
        def get_data():
            return 'test'
    
    if __name__ == '__main__':
        foo.bar = bar_mock
        d = foo.Data()
        print d.val    # prints 'test'
    

虽然这可以让您通过一个简单的测试用例,但您最好查看一个模拟库来处理这个问题。

因此,基本上您是在问如何让一个类使用一个模拟,而不是单独模块中的另一个东西?这是所有模拟库最基本的用例。你有一个具体的例子说明这些方法失败了吗?我想避免使用模拟库。应该可以不用它,我只希望它不会太复杂。你绝对应该使用一个模拟库。做好这项工作需要大量极其脆弱、复杂和微妙的代码。你可以不费吹灰之力快速完成一次性的monkey补丁,但你必须在任何地方重复它(或者你推广它,在这一点上你有一个糟糕的自制模拟库),这将是失败的另一个原因,它将使调试更加困难,你会花很多时间来解决这个问题,而不是你正在测试的代码。我已经尝试了你自己提出的方案,但不够仔细。现在,在分析您的示例并仔细查看代码之后,我正在测试它是否有效!谢谢!!没问题,如果我的答案对你有帮助,你可以点击旁边复选标记的轮廓。