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

时间:2012-10-03 17:29:10

标签: python

问题在于单元测试。 我创建了一个我正在测试的类的实例,并尝试测试其中一个方法。该方法使用从单独模块中定义的不同类获取的数据。我要模仿那个模块。 我如何访问我的实例的名称空间 - 我必须在运行我正在测试的方法之前执行它,以模拟模块,其中包含我的方法从中获取数据的类的定义?

1 个答案:

答案 0 :(得分:2)

我将在这里创建一个例子,我认为这与你想要做的事情相似。

假设您有一些我们称之为Data的课程,该课程在模块foo中定义。 foo模块导入barfoo.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'
    

虽然这样可以让您了解一个简单的测试用例,但最好还是选择一个模拟库来为您处理这个问题。