Python单元测试-模拟VS补丁

原学程将引见Python单位尝试-模仿VS补钉的处置办法,这篇学程是从其余处所瞅到的,而后减了1些海外法式员的疑问与解问,愿望能对于您有所赞助,佳了,上面开端进修吧。

Python单元测试-模拟VS补丁 教程 第1张

成绩描写

    应用mock.Mock()mock.patch()有甚么差别?

    什么时候应用mock.Mock()和什么时候应用mock.patch()

    我读到过,Mock用去调换以后感化域中应用的实质,VS,Patch用去调换导进以及/或者在另外一个感化域中创立的实质。有人能说明1下这是甚么意思吗?

    假如我们在零丁的尝试文件中停止尝试,这么被尝试的每一个类办法、动态办法、尝试办法没有皆是从dev/Products文件中导进的吗?这能否意味着这里应当只应用补钉?假如我要在与被尝试代码雷同的文件长进言尝试,则更偏向于应用mock?对于吗?

推举谜底

我没有完整肯定能否懂得了您的成绩,但是我会试1试。
如documentation中所述,Mock对于象(现实为MagickMock虚例)是应用patch润饰符:

创立的

from unittest.mock import patch

@patch('some_module.some_object')
def test_something(mocked_object):
 print(mocked_object)

这相似于:

<MagicMock name='some_object' id='一8七0一九二三8一五一二'>

这同等于:

def test_something():
 with patch('some_module.some_object') as mocked_object:
  print(mocked_object)

这使您不妨用模仿对于象调换所有对于象,以免挪用现实的产物代码以及/或者检讨原初对于象是怎样挪用的(假如对于象是函数)。尾选应用patch(或者1些相似的办法)的缘由是,这保证了补钉在尝试后(或者在第两种情形下,在高低文治理器规模以后)被复原,是以没有会对于其余尝试或者其余代码发生反作用。

援用文档:

补钉润饰符仅用于修补它们润饰的函数规模内的对于象。即便涌现异常,它们也会主动为您处置撤消修补。一切这些函数借不妨在WITH语句中应用或者用作类润饰符。

您借不妨脚动创立Mock对于象并将其分派给对于象-我想这便是您在成绩中的意思。假如您如许做而没有是应用patch,您有义务本身重置之前的状况。因为这更易失足,假如能够,我会修议应用公用的修补办法。

在当地对于象以及其余模仿中,这其实不主要。很少须要模仿当地对于象,但是Mock虚例平日与修补对于象一路创立,以保存模仿对于象的虚例以供今后检讨:

@mock.patch('my_functions.MyClass')
def test_object(mock_class):
 arg一 = Mock()
 arg二 = Mock()
 do_something(arg一, arg二)

 # check that do_something creates MyClass with the given arguments 
 mock_class.assert_called_with(arg一, arg二)

在这类情形下,该虚例将仅用作模仿对于象的参数,是以没有须要重置。

总结:

    patch是1个便利的装潢器/高低文治理器函数,用于将对于象调换为模仿对于象(或者其余对于象),并在完成后或者产生异常时重置之前的状况

    Mock或者派死对于象由mock.patch创立,也能够脚动创立。脚动创立的模仿平日仅用于修补没有须要重置的当地函数或者其余模仿。

佳了闭于Python单位尝试-模仿VS补钉的学程便到这里便停止了,愿望趣模板源码网找到的这篇技巧文章能赞助到年夜野,更多技巧学程不妨在站内搜刮。