python的现代模拟库。
mimid的Python项目详细描述
mimid
python的现代模拟库。
65039;该项目正在进行大量开发,api可能不稳定。
安装
要安装mimid
,只需使用pip
:
$ pip install mimid
快速启动
frommimidimportmock,every,verify,any,gtdefadd(a:int,b:int)->int:returna+bdeftest_add():add_mock=mock(add)every(add_mock).returns(5)result=add_mock(2,2)assertresult==5verify(add_mock).with_args(any(),gt(0)).called(times=1)
功能
mimid支持以下功能:
- 简单的模拟行为配置和验证
- 使用类和普通函数
- 完全键入提示-它与IDE和类型检查程序一起工作
- 干净的api,没有太多的魔力
为什么不mock
?
python内置的mock
模块是一个很棒的工具。如果你想在考试中模仿某样东西,这是第一选择。
但是它有一些缺点:
- 它不能很好地与现代ide(例如自动完成)和类型检查程序一起工作
- 很难为不同的情况定义不同的行为
- 它允许过多的自由,您可以对模拟对象执行任何操作,即使您没有定义任何行为
灵感
mimid的灵感来自于模拟jvm世界中的框架,比如mockito或mockk。
用法
模拟工作流中有3个简单步骤:
此外,您还可以在配置和验证步骤中使用matchers。
创建
必须使用mock
函数来创建模拟对象。它既适用于类,也适用于函数。
类示例:
frommimidimportmockclassA:deffoo(self,param):passclass_mock=mock(A)
功能示例:
frommimidimportmockdeffoo(param):passfunction_mock=mock(foo)
配置
在调用mock(函数或方法)之前,必须配置其行为。使用附加的every
方法(returns
,raises
,…)定义它在测试期间的工作方式。
frommimidimportmock,everydeffoo(param):passfunction_mock=mock(foo)every(function_mock).returns(1)
您还可以指定应该触发已定义行为的参数。
frommimidimportmock,everydeffoo(param):passfunction_mock=mock(foo)every(function_mock).with_args(param=2).returns(1)every(function_mock).with_args(param=3).raises(Exception())
可用配置:
Configuration | Description |
---|---|
^{ | return given value |
^{ | return each value from provided list |
^{ | raise given exception |
^{ | call given callable |
验证
在测试结束时,您可以检查mock是否按预期使用verify
调用。
frommimidimportmock,verifydeffoo(param):passfunction_mock=mock(foo)...# mock callsverify(function_mock).called(times=2)
您也可以在验证步骤中使用相同的with_args
:
frommimidimportmock,every,verifydeffoo(param):passfunction_mock=mock(foo)...# mock callsverify(function_mock).with_args(param=1).called(times=2)
匹配器
您可以在配置(with_args
)和验证(with_args
,called
)步骤中使用匹配器。您还可以将matchers与|
或&
组合在一起,并用~
否定它。
示例:
frommimidimportmock,every,verify,gt,lt,gtedeffoo(param):passfunction_mock=mock(foo)every(function_mock).with_args(gt(0)).returns(1)result=function_mock(10)assertresult==1verify(function_mock).with_args(gt(5)|lt(15)).called(times=gte(1))
capture
是一个特殊的匹配器-它的行为类似于any()
,但另外
将给定参数存储在提供的槽中。
示例:
frommimidimportmock,every,slot,capturedeffoo(param):passfunction_mock=mock(foo)param_slot=slot()every(function_mock).with_args(capture(param_slot)).execute(lambda:param_slot.value+1)result=function_mock(1)assertresult==2assertparam_slot.value==1
可用的匹配器:
Matcher | Description |
---|---|
^{ | match any value |
^{ | match equal value |
^{ | match lower value |
^{ | match lower or equal value |
^{ | match greater value |
^{ | match greater or equal value |
^{ | capture provided argument |
作者
由Konrad Hałas创建。