Skip to content

Instantly share code, notes, and snippets.

@un-def
Last active August 1, 2018 17:34
Show Gist options
  • Save un-def/f4386ee3eb8f7025a8e2934570a85f1c to your computer and use it in GitHub Desktop.
Save un-def/f4386ee3eb8f7025a8e2934570a85f1c to your computer and use it in GitHub Desktop.
pytest inline fixtures
from inspect import isfunction, signature, Parameter
import pytest
def make_fixture(value, scope='function'):
if isfunction(value):
sig = signature(value)
if 'self' in sig.parameters:
fixture = lambda self, **fxs: value(self, **fxs) # noqa: E731
else:
fixture = lambda self=None, **fxs: value(**fxs) # noqa: E731
self_parameter = Parameter(
name='self',
kind=Parameter.POSITIONAL_ONLY,
default=None,
)
new_parameters = [self_parameter, *sig.parameters.values()]
sig = sig.replace(parameters=new_parameters)
fixture.__signature__ = sig
else:
fixture = lambda self=None: value # noqa: E731
return pytest.fixture(scope=scope)(fixture)
foo = make_fixture('foo')
bar = make_fixture(lambda: 'bar')
foobar = make_fixture(lambda foo, bar: foo + bar)
def test(foo, bar, foobar):
assert foo == 'foo'
assert bar == 'bar'
assert foobar == 'foobar'
class Test:
value = '[self]'
foo = make_fixture('FOO')
bar = make_fixture(lambda: 'BAR')
foobar = make_fixture(lambda foo, bar: foo + bar)
selffoobar = make_fixture(lambda self, foo, bar: self.value + foo + bar)
def test(self, foo, bar, foobar, selffoobar):
assert foo == 'FOO'
assert bar == 'BAR'
assert foobar == 'FOOBAR'
assert selffoobar == '[self]FOOBAR'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment