python的现代模拟库。

mimid的Python项目详细描述


mimid

Build StatusCoverage StatusLicenseVersionPython versionsCode style: black

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世界中的框架,比如mockitomockk

用法

模拟工作流中有3个简单步骤:

  1. Creation
  2. Configuration
  3. Verification

此外,您还可以在配置和验证步骤中使用matchers

创建

必须使用mock函数来创建模拟对象。它既适用于类,也适用于函数。

类示例:

frommimidimportmockclassA:deffoo(self,param):passclass_mock=mock(A)

功能示例:

frommimidimportmockdeffoo(param):passfunction_mock=mock(foo)

配置

在调用mock(函数或方法)之前,必须配置其行为。使用附加的every 方法(returnsraises,…)定义它在测试期间的工作方式。

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())

可用配置:

ConfigurationDescription
^{}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_argscalled)步骤中使用匹配器。您还可以将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

可用的匹配器:

MatcherDescription
^{}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创建。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
静态函数中局部变量的java垃圾收集   java向ImageView添加投掷手势   java spring引导未根据配置文件读取正确的属性   主屏幕小部件中的java自定义布局   java JSP:具有相对路径的FileReader引发FileNotFoundException   java Hibernate在集合上循环时删除会话   java无法建立到jdbc:oracle:thin:@localhost:1521:XE的连接   java我可以使用Hibernate对特定的整数大小进行验证吗?   批处理文件如何注意Java中不同语言环境中的文件名   用于IntelliJ中声纳、PMD、Findbugs和Checkstyle的Java 8   在PIG程序中找不到java类分布式文件系统   Java游戏引擎中动态ZOrdering的绘制   java处理线程工作者的多个错误   带有MariaDB驱动程序的java MySQL服务器产生日期排序错误   java终止线程的正确方法   java Android在手机睡眠时发送udp   java如何将文档添加到事务内部的Firebase集合?