Nose2有这个令人敬畏的Such DSL与RSpec类似。我曾经直接使用单元测试,并用mock.patch之类的东西装饰了这个函数。我想知道should
装饰函数与常规单元测试函数的区别,以及如何使用其他装饰器作为单元测试函数。
我可以让它像这样工作,但似乎失去了passing in the unittest instance in the arguments的能力。任何建议将非常感激。谢谢!
@it.should('do something')
@mock.patch('my.package.lib.b')
@mock.patch('my.package.lib.a')
def test(a, b):
pass
答案 0 :(得分: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
因为patch
和should
的实施方式。两个库都会对结果修饰函数做出一些假设,因此不可能直接将装饰结果从一个传递给另一个。
但是我们可以使用“适配器”装饰器从外部修复它:
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
这是相当快速和肮脏但完成工作。我会看看我是否可以改进并使其更好。