我是一名初级程序员,过去一周我一直在努力编写单元测试。我阅读了单元测试文档,并观看了两个关于用Mock
实现单元测试的长教程。文档广泛引用了mocking类,但对于函数,我不确定是否应该使用@patch/with patch
、patch.dict{}
、side_effect
或其他选项来模拟函数,特别是函数的参数。
mymodule.py
def regex():
'''Runs a regex, creates a dict 'data' and then calls scraper(data)'''
def scraper(data):
'''scrapes a website and then calls a function which submits data to a db'''
我想创建一个测试,将测试数据传递给函数scraper
。提前谢谢。
是的,您也可以使用mock对非面向对象的代码进行单元测试。
参见以下示例:
from unittest.mock import MagicMock
def a():
return 10
def b():
print(a())
b()
a = MagicMock(return_value=3)
b()
输出为:
10
3
在前面的示例中,mock用于伪造/模拟函数a((,因此您可以单独测试函数b((,b((是您的SUT,而无需调用a((的实际实现。这对于更复杂的代码非常有用,特别是当函数a((依赖于在单元测试级别中可能不可用的数据时。
您没有给出足够的例子来真正提供帮助,但有几个观察结果:
-
通常,最好构建代码以避免在测试中进行嘲讽;在可能的范围内,每个函数都应该是一段独立的代码,可以单独调用。
-
没有必要嘲笑争论;只需通过.中的测试值
-
我不确定这个代码的意图:
bar = {'key': 'value'} def foo(bar): pass
在外部级别定义的
bar
是与函数定义中用作参数的bar
完全独立的变量。给他们起相同的名字是令人困惑的。。。 -
函数可以使用
patch
或patch.object
与return_value=...
选项进行模拟;不过,这通常意味着需要重构代码,以减少两个函数之间的依赖关系。