Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将mock.patch decorators与nose2这样的DSL一起使用_Python_Mocking_Decorator_Patch_Nose2 - Fatal编程技术网

Python 将mock.patch decorators与nose2这样的DSL一起使用

Python 将mock.patch decorators与nose2这样的DSL一起使用,python,mocking,decorator,patch,nose2,Python,Mocking,Decorator,Patch,Nose2,Nose2有一个与RSpec类似的很棒的功能。我曾经直接使用unittests,并用类似的东西装饰函数。我想知道修饰函数与常规的unittest函数有何不同,以及如何使用其他修饰函数作为unittest函数 我可以让它像这样工作,但它似乎失去了控制的能力。任何建议都将不胜感激。谢谢 @it.should('do something')) @mock.patch('my.package.lib.b') @mock.patch('my.package.lib.a') def测试(a、b): 通过 所

Nose2有一个与RSpec类似的很棒的功能。我曾经直接使用unittests,并用类似的东西装饰函数。我想知道
修饰函数与常规的unittest函数有何不同,以及如何使用其他修饰函数作为unittest函数

我可以让它像这样工作,但它似乎失去了控制的能力。任何建议都将不胜感激。谢谢

@it.should('do something'))
@mock.patch('my.package.lib.b')
@mock.patch('my.package.lib.a')
def测试(a、b):
通过

所以我们知道装饰师的订单很重要,但这些都不起作用:

@it.should('do something')
@mock.patch('datetime.date')
@mock.patch('datetime.time')
def test_1(date, time, case):
    pass

@mock.patch('datetime.time')
@mock.patch('datetime.date')
@it.should('do something')
def test_2(case, date, time):
    pass
因为
补丁
应该
的实现方式。这两个库都对得到的修饰函数做了一些假设,因此不可能直接将修饰结果从一个传递到另一个

但我们可以使用“适配器”装饰器从外部对此进行修复:

import mock
import nose2.tools

def fix_case(f):
    def test(case):
        f(case=case)
    return test

with nose2.tools.such.A('system') as it:

    @it.should('do something')
    @fix_case
    @mock.patch('datetime.time')
    @mock.patch('datetime.date')
    def test_3(date, time, case=None):
        print(date, time, case)

it.createTests(globals())
现在,这项工作将产生以下结果:

$ nose2 -v
test 0000: should do something (tests.test_nose2_such.A system) ...
(<MagicMock name='date' id='4334752592'>, <MagicMock name='time' id='4334762000'>,
<tests.test_nose2_such.A system testMethod=test 0000: should do something>)
ok

----------------------------------------------------------------------
Ran 1 test in 0.001s

OK
$nose2-v
测试0000:应该做些什么(测试。测试2。这样的系统)。。。
(,
)
好啊
----------------------------------------------------------------------
在0.001s内运行1次测试
好啊

这是相当快和肮脏,但得到的工作完成。我会看看我是否能改进它,让它变得更好。

谢谢,@famousgarkin。这是非常有帮助的,我稍后会尝试一下。我真的需要更深入地了解一下装饰师的来源。我还注意到nose2已经参数化了测试()。也许这是有用的东西?再次感谢!