在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补丁,但你必须在任何地方重复它(或者你推广它,在这一点上你有一个糟糕的自制模拟库),这将是失败的另一个原因,它将使调试更加困难,你会花很多时间来解决这个问题,而不是你正在测试的代码。我已经尝试了你自己提出的方案,但不够仔细。现在,在分析您的示例并仔细查看代码之后,我正在测试它是否有效!谢谢!!没问题,如果我的答案对你有帮助,你可以点击旁边复选标记的轮廓。