後比方說,我有這樣的幾個測試:銷燬Python中的模擬測試
class TestMyTest(unittest.TestCase):
def SetUpClass(cls):
cls.my_lib = MyLib()
def my_first_test(self):
self.my_lib.my_function = Mock(return_value=True)
self.assertTrue(self.my_lib.run_my_function(), 'my function failed')
def my_second_test(self):
# Some other test that calls self.my_lib.my_function...
而讓我們說我有MyLib中是這樣的:
class MyLib(Object):
def my_function(self):
# This function does a whole bunch of stuff using an external API
# ...
def run_my_function(self):
result = self.my_function()
# Does some more stuff
# ...
在my_first_test我我嘲笑my_lib.my_function,並在函數執行時返回True。在這個例子中,我的斷言是調用run_my_function(),它是來自同一個庫的另一個函數,除此之外,它調用my_lib.my_function。但是,當執行my_second_test時,我不想調用模擬函數,而是調用真正的函數。所以我想我需要在運行my_first_test之後以某種方式銷燬模擬,也許在tearDown()過程中。我如何摧毀這個模擬?
我編輯了我的原始問題以添加更多細節,因爲看起來並不那麼清楚,對此抱歉。
你的對象是在自己上運行測試並嘲笑它自己的實現嗎?這是在惹麻煩。通常你有一個測試類(使用內建的'unittest'),它與被測試的類不同。編輯 - 這將爲每個測試創建一個新的對象實例,所以不需要重置狀態。 – Joe
我使用了'self.assertTrue'來表明這是'unittest.TestCase'裏的所有內容,但是爲了簡單起見,它被省略了。如果情況並非如此,有些事情是非常錯誤的。 –
@PatrickCollins但是'self.my_lib.my_function'呢?這看起來像是測試對象的實現,或者他在設置中保留一個對象。也許你是對的,這是後者。 – Joe