描述类的规范工具
specif的Python项目详细描述
指定
类似于python的PHPSpec。只是为了好玩。如果您正在寻找一个真正有效的phpspec,可以检查flowp(但不推荐)。mamba也可能引起你的兴趣,即使这不是你正在搜索的内容。
安装
pip install specify
用法
您可以检查examples文件夹。
fromspecifyimportObjectBehaviorfromexamples.calculatorimportCalculatorclassCalculatorSpec(ObjectBehavior):def_let(self):self._describe(Calculator)self._be_constructed_with('lorem',id=32)defit_adds_the_numbers(self):self.add(2,3)._should_be(5)
命令python -m specify examples/spec/calculator_spec.py
将呈现有效的tap输出(希望如此)。
TAP version 13
1..1
ok 1 - CalculatorSpec: it adds the numbers
为了获得漂亮的输出,您可以使用像faucet这样的tap格式化程序。
所有规范必须以
it_
开头。所有规范文件现在必须以
_spec
结尾。
内置火柴
Matcher | Details | Alias |
---|---|---|
^{ | check with ^{ | ^{ |
^{ | check with ^{ | ^{ |
^{ | check with ^{ | ^{ |
^{ | check with ^{ | ^{ |
^{ | check with ^{ | ^{ |
^{ | check with ^{ |
自定义匹配器
您可以在规范中实现一个_matchers
函数来添加自定义匹配器。
匹配器的键由_should_
和第一个参数左修剪
传递给函数的是值本身。
如果返回false,则测试将失败。
下面是一个示例:
classCalculatorSpec(ObjectBehavior):# ...defit_adds_the_numbers(self):self.add(2,3)._should_be_a_number()self.add(2,3)._should_be_greater_than(10)def_matchers(self):defbe_a_number(value,*args):returnisinstance(value,int)defbe_greater_than(value,expected_value):returnvalue>expected_valuereturn{'be_a_number':be_a_number,'be_greater_than':be_greater_than}
流畅的API
所有匹配器(内置和自定义)都是可链接的。示例:
self.add(2, 3)._should_be_a_number()._should_be(5)._should_be_greater_than(3)
模拟
多亏了prophepy(你用prophecy
得到双关语了吗?呵呵),你可以
以一种Prophecy的方式轻松地模拟事物。
合作者
给定这个Displayer
类:
from.calculatorimportCalculatorclassDisplayer:def__init__(self,calculator:Calculator):self.calculator=calculatordefdisplay_addition(self,*args)->str:total=str(self.calculator.add(*args))args=[str(arg)forarginargs]returnf"{' + '.join(args)} = {total}"
这是规范,模拟Calculator
:
fromspecifyimportObjectBehavior,mockfromexamples.calculatorimportCalculatorfromexamples.displayerimportDisplayerclassDisplayerSpec(ObjectBehavior):@mock(Calculator)def_let(self,calculator):self._describe(Displayer)self._be_constructed_with(calculator)self.__calculator=calculatordefit_displays_addition(self):self.__calculator.add(2,3)._should_be_called()self.__calculator.add(2,3)._will_return(5)self.display_addition(2,3)._should_be_like('2 + 3 = 5')
轻松点。
对模块的内部调用
fromspecifyimportmock_internal# ...@mock_internal('getcwd',lambda:'loremipsum',from_module='os')defit_displays_addition(self):# ...# getcwd() will return 'loremipsum' and will be go back to default afterthetest
待办事项
- 处理属性而不仅仅是方法
- 改进模拟内部调用的方式
- 使抽头输出为规范所述的流
- 改进目前加载规范的糟糕方式(可能像mamba那样使用ast?)