3

Nose2 有这种很棒的DSL,其工作方式类似于 RSpec。我曾经直接使用单元测试,并用mock.patch之类的东西装饰了这个函数。我想知道should装饰函数与常规单元测试函数有何不同,以及如何将其他装饰器用于单元测试函数。

我可以让它像这样工作,但它似乎失去了在参数中传递 unittest 实例的能力。任何建议将不胜感激。谢谢!

@it.should('do something')
@mock.patch('my.package.lib.b')                                                                
@mock.patch('my.package.lib.a')                                                                   
def test(a, b):
    pass
4

1 回答 1

1

所以我们知道装饰器顺序很重要,但这些都不起作用:

@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

因为方式patchshould被执行。两个库都对最终的修饰函数做了一些假设,因此不可能直接将修饰结果从一个传递到另一个。

但是我们可以使用“适配器”装饰器从外部修复它:

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

这是相当快速和肮脏的,但可以完成工作。我会看看我是否可以改进这一点并让它变得更好。

于 2014-07-08T08:29:26.980 回答