考虑模块 some_module.py
具有以下内容(在我的实际用例中,SomeClass
和 some_function
在单独的模块中定义):
class SomeClass:
def __init__(self, v):
self.some_attr = v
def some_method(self):
self.some_attr += self.some_attr
def some_function(val):
c = SomeClass(val)
c.some_method()
return c
假设我已经对 SomeClass
进行了单元测试使用 pytest .现在我要单元测试 some_function
.我的理解是我应该 mock 与 SomeClass
相关的所有内容。 .我尝试的是将以下测试函数添加到 some_module.py
:def test_some_function(mocker):
# arrange
c = mocker.MagicMock()
c.some_attr = 10
mocker.patch('some_module.SomeClass', return_value=c)
mocker.patch('some_module.SomeClass.some_method')
# act
c = some_function(10)
# assert
assert c.some_attr == 20
运行 pytest some_module.py
在终端中(显然)导致测试失败 c.some_attr
是 10. 测试函数应该是什么样的?
最佳答案
在您的示例中,由于 SomeClass
已经测试成功,自 some_function
的目的似乎只是返回一个 SomeClass
的实例其中some_method
已被调用一次且仅一次,模拟它没有意义(如果可能,最好是 avoid mocks)。
因此,我建议您测试some_function
像这样:
from some_module import SomeClass, some_function
def test_some_function():
c = some_function(10)
assert isinstance(c, SomeClass)
assert c.some_attr == 20
c = some_function(-10)
assert isinstance(c, SomeClass)
assert c.some_attr == -20
c = some_function(0)
assert isinstance(c, SomeClass)
assert c.some_attr == 0
关于python-3.x - 使用 pytest 对包含某个类的实例的某个函数进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69481486/