在记忆化函数周围进行Python测试
我正在做一些测试,发现当我把它们一起运行时,有些测试会失败。经过调查,我发现问题出在我们对系统调用的缓存上。
因为我在模拟系统调用,而不是缓存的函数,所以这个函数只计算一次,这样就把信息泄露到了后面的测试中。
处理缓存函数的优雅方法有哪些呢:
- 模拟这些缓存的函数,而不是系统调用
- 给缓存函数加一个参数,让它在测试时不工作
- 模拟缓存装饰器,让它返回参数
- 找到数据被缓存的地方,并在每个测试结束时清理它
还有其他想法吗?
谢谢
2 个回答
0
试试用 MagicMock
代替普通的 Mock
。
假设你的代码是这样的:
@memoize.Memoize()
def OAuthClient():
"""Returns an Oauth client."""
return 'blah'
用 Mock
这样模拟:
mymodule.OauthPasswordClient = mock.Mock()
会返回这样的错误:
TypeError: unsupported operand type(s) for +=: 'int' and 'Mock'
但是用 MagicMock
这样模拟:
mymodule.OauthPasswordClient = mock.MagicMock()
就能正常工作了。
1
可能有点晚了,但我发现使用 delete_memoized
非常简单:
# your function
@memoize(timeout=50)
def your_long_function():
# do stuff
# your test
def test_get_folder_content_error_handled(self, flf):
delete_memoized(your_long_function)
your_long_function()
我刚在 Django 中用这个方法(使用 django-memoize)试了一下,效果非常好!