记录然后断言模拟库
dingus的Python项目详细描述
一个dingus有点像一个模拟对象。主要的区别在于你没有提前设定期望值。您只需运行代码,在另一个对象或类的
位置使用一个dingus,它就会记录发生在它身上的事情。然后,
一旦您的代码被执行,您就可以断言它对dingus做了什么。
从dingus类创建了一个新的dingus。您可以给dingues命名,
这有助于调试您的测试,特别是当有多个
dingues在游戏中时。
>;>;from dingus import dingus
>;>;d=dingus('root')
>;>;d
<;dingus root>;
访问dingus的任何属性都将返回一个新的dingus。
>;d.something
<;dingus root.something>;
对于特殊的dingus方法有一些例外。我们将在
位中看到一些。丁格斯也可以像函数或方法一样被调用。它不在乎你给它多少参数,也不在乎那些参数是什么。对dingus的调用将始终返回相同的对象,而不考虑参数。
>;>;d()
<;dingus root()>;
>;>;d("参数")
<;dingus root()>;
>;>;d(55)
<;dingus root()>;
调用列表中的每个
条目都包含:
*调用的方法的名称(如果调用了dingus本身,则为"()")
*参数,如果没有,则为()
*关键字argumnets,如果没有,则为{}
*返回给调用方的值
以下是我们到目前为止对d所做的调用的列表:
>;>;来自pprint import pprint
>;>;pprint(d.calls)
[('('),(,),{},<;dingus root()>;),
('),('argument',),{},<;dingusroot()>;),
('()',(55,),{},<;dingus root()>;)]
您可以按名称、参数和关键字参数筛选调用:
>;>;pprint(d.calls('()',55))
[('()',(55,),{},<;dingus root()>;)]
如果不关心某个特定参数的值,则可以在筛选时使用该值
don t care:
{},<;dingus root()>;),
('()',(55,),{},<;dingus root()>;)]
dingues可以做的不仅仅是访问和调用属性。它们支持许多python操作符。我们的目标是允许并记录任何
交互:
>;>d=dingus('root')
>;>2**d.something)['hello'](/100*'foo'
<;dingus root.something.[uu rpow\[hello]()。[uu div\]uu mul\>;
(希望你真实世界的丁格斯录音不会像这样!)
==
修补
==
示例:
>;>from dingus import patch
>;>import urllib2
>>>>带补丁('urllib2.urlopen'):
…打印urllib2.urlopen.\uu class\ubr/><;class'dingus.dingus'>;
>;>;打印urllib2.urlopen.\uu class\ubr/><;键入'function'>;
;>;@patch('urllib2.urlopen')
…def test_something(self):
…通过
…
==
隔离
==
==
与补丁相反的是隔离。它会修补除命名对象之外的所有对象:
>;>from dingus import isolate
>;@isolate('urllib2.urlparse')
…定义测试解析(自身):
…通过
…
运行此测试时,urllib2模块中的所有内容(urlparse除外)都将是一个
dingus。请注意,如果模块包含许多
对象,则执行此操作可能会很慢;欢迎使用性能修补程序。:)
==
==
危险魔法
==
==
这允许您编写完全隔离的单元测试。有关示例,请参见
examples/urllib2/test\u urllib2.py。作者不再推荐这个特性,因为它可以鼓励非常脆弱的测试。您应该感受到手动模拟依赖关系的痛苦;当
类与太多其他类协作时,这种痛苦会告诉您。
位置使用一个dingus,它就会记录发生在它身上的事情。然后,
一旦您的代码被执行,您就可以断言它对dingus做了什么。
从dingus类创建了一个新的dingus。您可以给dingues命名,
这有助于调试您的测试,特别是当有多个
dingues在游戏中时。
>;>;from dingus import dingus
>;>;d=dingus('root')
>;>;d
<;dingus root>;
访问dingus的任何属性都将返回一个新的dingus。
>;d.something
<;dingus root.something>;
对于特殊的dingus方法有一些例外。我们将在
位中看到一些。丁格斯也可以像函数或方法一样被调用。它不在乎你给它多少参数,也不在乎那些参数是什么。对dingus的调用将始终返回相同的对象,而不考虑参数。
>;>;d()
<;dingus root()>;
>;>;d("参数")
<;dingus root()>;
>;>;d(55)
<;dingus root()>;
调用列表中的每个
条目都包含:
*调用的方法的名称(如果调用了dingus本身,则为"()")
*参数,如果没有,则为()
*关键字argumnets,如果没有,则为{}
*返回给调用方的值
以下是我们到目前为止对d所做的调用的列表:
>;>;来自pprint import pprint
>;>;pprint(d.calls)
[('('),(,),{},<;dingus root()>;),
('),('argument',),{},<;dingusroot()>;),
('()',(55,),{},<;dingus root()>;)]
您可以按名称、参数和关键字参数筛选调用:
>;>;pprint(d.calls('()',55))
[('()',(55,),{},<;dingus root()>;)]
如果不关心某个特定参数的值,则可以在筛选时使用该值
don t care:
{},<;dingus root()>;),
('()',(55,),{},<;dingus root()>;)]
dingues可以做的不仅仅是访问和调用属性。它们支持许多python操作符。我们的目标是允许并记录任何
交互:
>;>d=dingus('root')
>;>2**d.something)['hello'](/100*'foo'
<;dingus root.something.[uu rpow\[hello]()。[uu div\]uu mul\>;
(希望你真实世界的丁格斯录音不会像这样!)
==
修补
==
>;>from dingus import patch
>;>import urllib2
>>>>带补丁('urllib2.urlopen'):
…打印urllib2.urlopen.\uu class\ubr/><;class'dingus.dingus'>;
>;>;打印urllib2.urlopen.\uu class\ubr/><;键入'function'>;
;>;@patch('urllib2.urlopen')
…def test_something(self):
…通过
…
==
隔离
==
==
与补丁相反的是隔离。它会修补除命名对象之外的所有对象:
>;>from dingus import isolate
>;@isolate('urllib2.urlparse')
…定义测试解析(自身):
…通过
…
运行此测试时,urllib2模块中的所有内容(urlparse除外)都将是一个
dingus。请注意,如果模块包含许多
对象,则执行此操作可能会很慢;欢迎使用性能修补程序。:)
==
==
危险魔法
==
==
examples/urllib2/test\u urllib2.py。作者不再推荐这个特性,因为它可以鼓励非常脆弱的测试。您应该感受到手动模拟依赖关系的痛苦;当
类与太多其他类协作时,这种痛苦会告诉您。