在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__
with gzip.GzipFile('file_name.txt.gz','wb') as f:发布于 2012-01-19 09:23:39
由于某些原因,gzip.GzipFile的模拟实例没有以__exit__方法结束,这一点DSM是正确的。如果您忘记在与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对象的预期(即,设置了何时以及如何调用__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
OKhttps://stackoverflow.com/questions/8905472
复制相似问题