[svn r40702] (pedronis, arigo)
Add setup/teardown calls around generators, with the same semantics as around functions and methods. --HG-- branch : trunk
This commit is contained in:
parent
1b639695b4
commit
5506b03f81
|
@ -442,7 +442,9 @@ class Instance(PyCollectorMixin, Collector):
|
||||||
Collector.Function.__get__(self)) # XXX for python 2.2
|
Collector.Function.__get__(self)) # XXX for python 2.2
|
||||||
Function = property(Function)
|
Function = property(Function)
|
||||||
|
|
||||||
class Generator(PyCollectorMixin, Collector):
|
from py.__.test.item import FunctionMixin # XXX import order issues :-(
|
||||||
|
|
||||||
|
class Generator(FunctionMixin, PyCollectorMixin, Collector):
|
||||||
def run(self):
|
def run(self):
|
||||||
self._prepare()
|
self._prepare()
|
||||||
itemlist = self._name2items
|
itemlist = self._name2items
|
||||||
|
@ -468,13 +470,6 @@ class Generator(PyCollectorMixin, Collector):
|
||||||
call, args = obj, ()
|
call, args = obj, ()
|
||||||
return call, args
|
return call, args
|
||||||
|
|
||||||
def _getpathlineno(self):
|
|
||||||
code = py.code.Code(self.obj)
|
|
||||||
return code.path, code.firstlineno
|
|
||||||
|
|
||||||
def _getsortvalue(self):
|
|
||||||
return self._getpathlineno()
|
|
||||||
|
|
||||||
class DoctestFile(PyCollectorMixin, FSCollector):
|
class DoctestFile(PyCollectorMixin, FSCollector):
|
||||||
def run(self):
|
def run(self):
|
||||||
return [self.fspath.basename]
|
return [self.fspath.basename]
|
||||||
|
|
|
@ -37,38 +37,15 @@ class Item(py.test.collect.Collector):
|
||||||
def finishcapture(self):
|
def finishcapture(self):
|
||||||
self._config._finishcapture(self)
|
self._config._finishcapture(self)
|
||||||
|
|
||||||
class Function(Item):
|
class FunctionMixin(object):
|
||||||
""" a Function Item is responsible for setting up
|
""" mixin for the code common to Function and Generator.
|
||||||
and executing a Python callable test object.
|
|
||||||
"""
|
"""
|
||||||
_state = SetupState()
|
|
||||||
def __init__(self, name, parent, args=(), obj=_dummy, sort_value = None):
|
|
||||||
super(Function, self).__init__(name, parent)
|
|
||||||
self._args = args
|
|
||||||
if obj is not _dummy:
|
|
||||||
self._obj = obj
|
|
||||||
self._sort_value = sort_value
|
|
||||||
|
|
||||||
def __repr__(self):
|
|
||||||
return "<%s %r>" %(self.__class__.__name__, self.name)
|
|
||||||
|
|
||||||
def _getpathlineno(self):
|
def _getpathlineno(self):
|
||||||
code = py.code.Code(self.obj)
|
code = py.code.Code(self.obj)
|
||||||
return code.path, code.firstlineno
|
return code.path, code.firstlineno
|
||||||
|
|
||||||
def _getsortvalue(self):
|
def _getsortvalue(self):
|
||||||
if self._sort_value is None:
|
return self._getpathlineno()
|
||||||
return self._getpathlineno()
|
|
||||||
return self._sort_value
|
|
||||||
|
|
||||||
def run(self):
|
|
||||||
""" setup and execute the underlying test function. """
|
|
||||||
self._state.prepare(self)
|
|
||||||
self.execute(self.obj, *self._args)
|
|
||||||
|
|
||||||
def execute(self, target, *args):
|
|
||||||
""" execute the given test function. """
|
|
||||||
target(*args)
|
|
||||||
|
|
||||||
def setup(self):
|
def setup(self):
|
||||||
""" perform setup for this test function. """
|
""" perform setup for this test function. """
|
||||||
|
@ -92,6 +69,35 @@ class Function(Item):
|
||||||
if meth is not None:
|
if meth is not None:
|
||||||
return meth(self.obj)
|
return meth(self.obj)
|
||||||
|
|
||||||
|
class Function(FunctionMixin, Item):
|
||||||
|
""" a Function Item is responsible for setting up
|
||||||
|
and executing a Python callable test object.
|
||||||
|
"""
|
||||||
|
_state = SetupState()
|
||||||
|
def __init__(self, name, parent, args=(), obj=_dummy, sort_value = None):
|
||||||
|
super(Function, self).__init__(name, parent)
|
||||||
|
self._args = args
|
||||||
|
if obj is not _dummy:
|
||||||
|
self._obj = obj
|
||||||
|
self._sort_value = sort_value
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return "<%s %r>" %(self.__class__.__name__, self.name)
|
||||||
|
|
||||||
|
def _getsortvalue(self):
|
||||||
|
if self._sort_value is None:
|
||||||
|
return self._getpathlineno()
|
||||||
|
return self._sort_value
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
""" setup and execute the underlying test function. """
|
||||||
|
self._state.prepare(self)
|
||||||
|
self.execute(self.obj, *self._args)
|
||||||
|
|
||||||
|
def execute(self, target, *args):
|
||||||
|
""" execute the given test function. """
|
||||||
|
target(*args)
|
||||||
|
|
||||||
#
|
#
|
||||||
# triggering specific outcomes while executing Items
|
# triggering specific outcomes while executing Items
|
||||||
#
|
#
|
||||||
|
|
|
@ -42,14 +42,23 @@ class TestInheritedClassSetupStillWorks(TestSimpleClassSetup):
|
||||||
|
|
||||||
class TestSetupTeardownOnInstance(TestSimpleClassSetup):
|
class TestSetupTeardownOnInstance(TestSimpleClassSetup):
|
||||||
def setup_method(self, method):
|
def setup_method(self, method):
|
||||||
self.clslevel.append(17)
|
self.clslevel.append(method.__name__)
|
||||||
|
|
||||||
def teardown_method(self, method):
|
def teardown_method(self, method):
|
||||||
x = self.clslevel.pop()
|
x = self.clslevel.pop()
|
||||||
assert x == 17
|
assert x == method.__name__
|
||||||
|
|
||||||
def test_setup(self):
|
def test_setup(self):
|
||||||
assert self.clslevel[-1] == 17
|
assert self.clslevel[-1] == 'test_setup'
|
||||||
|
|
||||||
|
def test_generate(self):
|
||||||
|
assert self.clslevel[-1] == 'test_generate'
|
||||||
|
yield self.generated, 5
|
||||||
|
assert self.clslevel[-1] == 'test_generate'
|
||||||
|
|
||||||
|
def generated(self, value):
|
||||||
|
assert value == 5
|
||||||
|
assert self.clslevel[-1] == 'test_generate'
|
||||||
|
|
||||||
def test_teardown_method_worked():
|
def test_teardown_method_worked():
|
||||||
assert not TestSetupTeardownOnInstance.clslevel
|
assert not TestSetupTeardownOnInstance.clslevel
|
||||||
|
|
Loading…
Reference in New Issue