python-3.x - 使用 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
假设我已经SomeClass
使用pytest进行了单元测试。现在我想进行单元测试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
似乎只是返回一个已被调用一次且仅一次的实例SomeClass
,some_method
因此模拟它没有意义(最好尽可能避免模拟)。
因此,我建议你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
推荐阅读
- r - 如何增加由 grid.arrange 产生的绘图的大小
- php - 使用 str_word_count 计算对手单词中的字母
- php - 在php中为每个循环附加变量
- reactjs - IE10 中反应 vendor.js 中的羊皮纸定义无效
- selenium-webdriver - Jmeter - Selenium/Webdriver 支持:HTMLUNIT 驱动程序错误
- java - 如何在 hybris 中隐藏工单状态?
- maven - 将单独的jar文件打包到maven中的war文件
- c++ - codeforces 455A 的意外失败测试用例无聊
- r - 不能使用 geom_col 绘制 POSIXct 对象?
- javascript - 递归推送只添加最后一个元素