首先,问题的原因是官方的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(),这是非常适合这种情况的。我知道我可以通过以下方式实现存根模块功能:
self.mox.StubOutWithMock(module_to_mock, 'FunctionToMock')
module_to_mock.FunctionToMock().AndReturn(foo)但我不喜欢这样,因为这里我每次需要做两个动作。在类中有一个对模块的引用,并使用CreateMockAnything来模拟它,会更简单、更漂亮。
如果我错误地打印了某个函数名,那么期望就会失败(因为正在测试的代码调用的是正确的),所以这不是要点.
对于StubOutWithMock:如果我没有注意到测试方法中的一些额外的db函数调用,并且不会对它进行StubOutWithMock存根,它将调用真正的代码,并在db中留下一些垃圾。因此,还有一点要保护我的解决方案--使用CreateMockAnything而不是固执特定的方法,可以让我完全减少db依赖,而且我还会看到MockAnything模拟引发的意外方法调用异常。
那么,避免使用CreateMockAnything()的原因是什么?
谢谢,
发布于 2015-07-17 12:14:47
其主要原因是,在可能的情况下,只使用具有定义良好接口的对象通常是很好的编程实践。
根据我在您的案例中所看到的,这是一个完全可以接受的用例。
https://stackoverflow.com/questions/18662179
复制相似问题