首先是问题的原因——pymox官方文档: https://code.google.com/p/pymox/wiki/MoxDocumentation
MockAnything 部分中有一条声明告诉“除非绝对必要,否则不要使用它!”。我很感兴趣,这是为什么?它有一些限制吗?我个人觉得它非常有用。
我有以下情况:我在我的类中有一个模块的引用,该模块有一堆我的类使用的模块级函数。
import db
class A(object):
def __init__(self):
# To make possible dependency injection.
self.db = db
...
class Test_A(object):
def test(self):
a = A()
# Perform an injection.
a.db = mox.CreateMockAnything()
# Setting an expectation to any function
a.db.some_func().AndReturn(5)
...
因为这是一个模块,所以我不能用 CreateMock() 模拟它,因为这不是一个类型。因此,我使用了非常适合这种情况的 CreateMockAnything()。我知道我可以 stub 模块函数:
self.mox.StubOutWithMock(module_to_mock, 'FunctionToMock')
module_to_mock.FunctionToMock().AndReturn(foo)
但是我不喜欢这种方式,因为这里我每次需要做两个 Action 。在类中引用模块并使用 CreateMockAnything 模拟它会更简单、更漂亮。
如果我错误地打印了一些函数名,期望就会失败(因为被测试的代码正在调用正确的代码),所以这不是重点......
对于 StubOutWithMock:如果我不会注意到测试方法中的一些额外的 db 函数调用,并且不会对其进行 stub StubOutWithMock,它将调用真实代码并且在数据库中留下了一些垃圾。因此,还有一点可以保护我的解决方案 - 使用 CreateMockAnything 而不是 stub 特定方法让我可以完全切断我的数据库依赖性,而且我还会看到 MockAnything 模拟抛出的意外方法调用异常。
那么避免使用 CreateMockAnything() 的原因是什么?
谢谢,
最佳答案
这样做的主要原因是,在可能的情况下,仅使用具有明确定义的接口(interface)的对象通常是良好的编程习惯。
根据我在您的案例中看到的情况,这是一个完全可以接受的用例。
关于python - Mox(pymox)框架的CreateMockAnything()的优缺点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18662179/