首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mox (pymox)框架CreateMockAnything()的利弊

Mox (pymox)框架CreateMockAnything()的利弊
EN

Stack Overflow用户
提问于 2013-09-06 16:15:51
回答 1查看 762关注 0票数 3

首先,问题的原因是官方的pymox文档:https://code.google.com/p/pymox/wiki/MoxDocumentation

MockAnything部分中有一条语句告诉:“除非您绝对必须使用它,否则不要使用它!”。我很有趣,为什么?它有一些限制吗?我个人认为它非常有用。

我有以下情况:我在我的类中引用了模块,该模块有一堆我的类使用的模块级函数。

代码语言:javascript
复制
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(),这是非常适合这种情况的。我知道我可以通过以下方式实现存根模块功能:

代码语言:javascript
复制
self.mox.StubOutWithMock(module_to_mock, 'FunctionToMock') 
module_to_mock.FunctionToMock().AndReturn(foo)

但我不喜欢这样,因为这里我每次需要做两个动作。在类中有一个对模块的引用,并使用CreateMockAnything来模拟它,会更简单、更漂亮。

如果我错误地打印了某个函数名,那么期望就会失败(因为正在测试的代码调用的是正确的),所以这不是要点.

对于StubOutWithMock:如果我没有注意到测试方法中的一些额外的db函数调用,并且不会对它进行StubOutWithMock存根,它将调用真正的代码,并在db中留下一些垃圾。因此,还有一点要保护我的解决方案--使用CreateMockAnything而不是固执特定的方法,可以让我完全减少db依赖,而且我还会看到MockAnything模拟引发的意外方法调用异常。

那么,避免使用CreateMockAnything()的原因是什么?

谢谢,

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-17 12:14:47

其主要原因是,在可能的情况下,只使用具有定义良好接口的对象通常是很好的编程实践。

根据我在您的案例中所看到的,这是一个完全可以接受的用例。

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

https://stackoverflow.com/questions/18662179

复制
相关文章

相似问题

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