使用 pytest 对包含某些 class 实例的某些函数进行单元测试
Unittesting some function comprising instance of some class with pytest
考虑具有以下内容的模块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
假设我已经使用 pytest 对 SomeClass
进行了单元测试。现在我想单元测试 some_function
。我的理解是我应该嘲笑与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
的目的似乎只是 return 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
考虑具有以下内容的模块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
假设我已经使用 pytest 对 SomeClass
进行了单元测试。现在我想单元测试 some_function
。我的理解是我应该嘲笑与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
的目的似乎只是 return 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