also improve missing funcarg error for setup functions

This commit is contained in:
holger krekel 2012-08-08 14:53:47 +02:00
parent dd268c1b2b
commit 935761f098
2 changed files with 58 additions and 34 deletions

View File

@ -949,9 +949,9 @@ class FuncargRequest:
self.parentid) self.parentid)
return facdeflist return facdeflist
#def raiseerror(self, msg): def raiseerror(self, msg):
# """ raise a FuncargLookupError with the given message. """ """ raise a FuncargLookupError with the given message. """
# raise self.funcargmanager.FuncargLookupError(self.function, msg) raise self.funcargmanager.FuncargLookupError(self.function, msg)
@property @property
def function(self): def function(self):
@ -1375,22 +1375,26 @@ class FuncargManager:
for setupcall in setuplist: for setupcall in setuplist:
if setupcall.active: if setupcall.active:
continue continue
testcontext = TestContextSetup(request, setupcall) request._factorystack.append(setupcall)
kwargs = {} try:
for name in setupcall.funcargnames: testcontext = TestContextSetup(request, setupcall)
try: kwargs = {}
kwargs[name] = request.getfuncargvalue(name) for name in setupcall.funcargnames:
except FuncargLookupError: try:
if name == "testcontext": kwargs[name] = request.getfuncargvalue(name)
kwargs[name] = testcontext except FuncargLookupError:
else: if name == "testcontext":
raise kwargs[name] = testcontext
scope = setupcall.scope or "function" else:
scol = setupcall.scopeitem = request._getscopeitem(scope) raise
self.session._setupstate.addfinalizer(setupcall.finish, scol) scope = setupcall.scope or "function"
for argname in setupcall.funcargnames: # XXX all deps? scol = setupcall.scopeitem = request._getscopeitem(scope)
self.addargfinalizer(setupcall.finish, argname) self.session._setupstate.addfinalizer(setupcall.finish, scol)
setupcall.execute(kwargs) for argname in setupcall.funcargnames: # XXX all deps?
self.addargfinalizer(setupcall.finish, argname)
setupcall.execute(kwargs)
finally:
request._factorystack.remove(setupcall)
def addargfinalizer(self, finalizer, argname): def addargfinalizer(self, finalizer, argname):
l = self._arg2finish.setdefault(argname, []) l = self._arg2finish.setdefault(argname, [])

View File

@ -2338,21 +2338,41 @@ class TestTestContextScopeAccess:
reprec.assertoutcome(passed=1) reprec.assertoutcome(passed=1)
def test_illdefined_factory(testdir): class TestErrors:
testdir.makepyfile(""" def test_subfactory_missing_funcarg(self, testdir):
import pytest testdir.makepyfile("""
@pytest.factory() import pytest
def gen(request): @pytest.factory()
return 1 def gen(request):
def test_something(gen): return 1
pass def test_something(gen):
""") pass
result = testdir.runpytest() """)
assert result.ret != 0 result = testdir.runpytest()
result.stdout.fnmatch_lines([ assert result.ret != 0
"*def gen(request):*", result.stdout.fnmatch_lines([
"*no factory*request*", "*def gen(request):*",
]) "*no factory*request*",
"*1 error*",
])
def test_setupfunc_missing_funcarg(self, testdir):
testdir.makepyfile("""
import pytest
@pytest.setup()
def gen(request):
return 1
def test_something():
pass
""")
result = testdir.runpytest()
assert result.ret != 0
result.stdout.fnmatch_lines([
"*def gen(request):*",
"*no factory*request*",
"*1 error*",
])
class TestTestContextVarious: class TestTestContextVarious:
def test_newstyle_no_request(self, testdir): def test_newstyle_no_request(self, testdir):