gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 19:23:38 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com