python - Mox(pymox)框架的CreateMockAnything()的优缺点

标签 python unit-testing mocking pymox

首先是问题的原因——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/

相关文章:

Python:在包含代理对时获取正确的字符串长度

javascript - 检查子组件是否呈现 - Jest, Enzyme

node.js - 如何使用 sinon/mocha 模拟 npm 模块

unit-testing - mock 还是不 mock ?

python - 替换列表中的 N 个特定条目

php - 如何在进程完成时执行操作,同时有多个进程正在运行

python - 无法运行 Celery 教程

javascript - RequireJS - 从优化构建中省略测试代码

unit-testing - 分支覆盖与决策覆盖相同吗?

asp.net-mvc-3 - 模拟 Request.QueryString 用于单元测试并针对 View 进行断言