簡體   English   中英

Python單元測試如何使用Mox模擬帶有語句的gzip

[英]Python unit test how to use Mox to mock the gzip with statement

在Python中,如何使用mox單元測試庫模擬在with語句中創建的對象

class MyCode:
    def generate_gzip_file(self):
        with gzip.GzipFile('file_name.txt.gz','wb') as f:
             f.write('data')

單元測試

class MyCodeTest(unittest.TestCase):
    def test_generate_gzip_file(self):
        mox = mox.Mox()
        mock_gzip_file = self.mox.CreateMock(gzip.GzipFile)
        mox.StubOutWithMock(gzip, 'GzipFile')
        gzip.GzipFile('file_name.txt.gz','wb').AndReturn(mock_file)
        mock_gzip_file.write('data')
        mox.ReplayAll()
        MyCode().generate_gzip_file()
        mox.VerifyAll()

AttributeError: __exit__上收到錯誤AttributeError: __exit__

with gzip.GzipFile('file_name.txt.gz','wb') as f:

DSM是正確的,因為某種原因, gzip.GzipFile實例未以__exit__方法結束。 如果忘記在與with語句with使用的類上定義__exit__ ,則會得到完全相同的錯誤。 例如:

>>> class C(object):
...   def __enter__(self):
...     return self
... 
>>> with C() as c:
...   pass
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: __exit__

幸運的是,您可以通過使用Mox的CreateMockAnything()方法來創建不執行特定接口的mock_gzip_file對象,來解決此問題。 您需要注意確保正確設置了對mock_gzip_file對象的期望(即,對於何時以及如何__exit__(...) __enter__()__exit__(...)方法設置了期望)。 這是一個對我有用的例子:

import gzip
import mox
import unittest

class MyCode:
    def generate_gzip_file(self):
        with gzip.GzipFile('file_name.txt.gz', 'wb') as f:
             f.write('data')

class MyCodeTest(unittest.TestCase):
    def test_generate_gzip_file(self):
        mymox = mox.Mox()
        mock_gzip_file = mymox.CreateMockAnything()
        mymox.StubOutWithMock(gzip, 'GzipFile')
        gzip.GzipFile('file_name.txt.gz', 'wb').AndReturn(mock_gzip_file)
        mock_gzip_file.__enter__().AndReturn(mock_gzip_file)
        mock_gzip_file.write('data')
        mock_gzip_file.__exit__(None, None, None).AndReturn(None)
        mymox.ReplayAll()

        MyCode().generate_gzip_file()
        mymox.VerifyAll()

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

當我運行它時,我得到:

.
----------------------------------------------------------------------
Ran 1 test in 0.001s

OK

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM