在单元测试时重新加载当前模块

2 投票
2 回答
1337 浏览
提问于 2025-04-30 15:17

在运行一个简单的单元测试时,有时候把测试放在同一个类里会更方便。不过,我不知道怎么重新加载当前的模块,所以每当需要这样做的时候,我就得把测试移到一个单独的模块里。有没有什么办法可以解决这个问题呢?

module: foo
import unittest

class MyObject
...

class MockMyObject
...

class TestMock(unittest.TestCase):

    def setUp(self):
        MyObject = MockMyObject
        mocked = MyObject()

    def tearDown(self):
        reload(foo) # what goes here?

    def testFunction(self):
        mocked.do_mocked_function()

if __name__ == "__main__":
    unittest.main()

我找到的解决方法是在 tearDown 方法里使用 import sysreload(sys.modules[__name__]),但我在想是否还有更好的方法。

暂无标签

2 个回答

1

重新加载你的模块并不是个好主意。

class TestMock(unittest.TestCase):

def setUp(self):
    MyObject = MockMyObject
    self.mocked = MyObject()

def tearDown(self):
    pass

def testFunction(self):
    self.mocked.do_mocked_function()
2

你可以把你原来的类保存在一个变量里,然后在 tearDown 函数中把它恢复回来。
下面是一个例子:

class TestMock(unittest.TestCase):

    original = MyObject

    def setUp(self):
        global MyObject
        MyObject = MockMyObject

    def tearDown(self):
        global MyObject
        MyObject = TestMock.original

    def testFunction(self):
        MyObject().do_mocked_function()

撰写回答