首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python单元测试如何使用Mox模拟gzip with语句

Python单元测试如何使用Mox模拟gzip with语句
EN

Stack Overflow用户
提问于 2012-01-18 13:09:16
回答 1查看 2.2K关注 0票数 1

在Python中,如何使用mox单元测试库模拟在with语句中创建的对象

代码

代码语言:javascript
复制
class MyCode:
    def generate_gzip_file(self):
        with gzip.GzipFile('file_name.txt.gz','wb') as f:
             f.write('data')

单元测试

代码语言:javascript
复制
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__

代码语言:javascript
复制
with gzip.GzipFile('file_name.txt.gz','wb') as f:
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-19 09:23:39

由于某些原因,gzip.GzipFile的模拟实例没有以__exit__方法结束,这一点DSM是正确的。如果您忘记在与with语句一起使用的类上定义__exit__,您将得到完全相同的错误。例如:

代码语言:javascript
复制
>>> 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__(...)方法的预期)。下面是一个适用于我的例子:

代码语言:javascript
复制
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()

当我运行这个命令时,我得到:

代码语言:javascript
复制
.
----------------------------------------------------------------------
Ran 1 test in 0.001s

OK
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8905472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档