Skip to content

Commit

Permalink
Merge pull request #1444 from novas0x2a/fixture-custom-name
Browse files Browse the repository at this point in the history
Allow custom fixture names for fixtures
  • Loading branch information
RonnyPfannschmidt committed Mar 14, 2016
2 parents c2b9196 + 9577120 commit 0cacdef
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 5 deletions.
1 change: 1 addition & 0 deletions AUTHORS
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ Matt Williams
Michael Aquilina
Michael Birtwell
Michael Droettboom
Mike Lundy
Nicolas Delaby
Pieter Mulder
Piotr Banaszkiewicz
Expand Down
8 changes: 7 additions & 1 deletion CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,11 @@
namespace in which your doctests run.
Thanks `@milliams`_ for the complete PR (`#1428`_).

*
* New ``name`` argument to ``pytest.fixture`` mark, which allows a custom name
for a fixture (to solve the funcarg-shadowing-fixture problem).
Thanks `@novas0x2a`_ for the complete PR (`#1444`_).

*

*

Expand All @@ -21,8 +25,10 @@
*

.. _@milliams: https://github.com/milliams
.. _@novas0x2a: https://github.com/novas0x2a

.. _#1428: https://github.com/pytest-dev/pytest/pull/1428
.. _#1444: https://github.com/pytest-dev/pytest/pull/1444


2.9.1.dev1
Expand Down
18 changes: 14 additions & 4 deletions _pytest/python.py
Original file line number Diff line number Diff line change
Expand Up @@ -114,12 +114,13 @@ def safe_getattr(object, name, default):

class FixtureFunctionMarker:
def __init__(self, scope, params,
autouse=False, yieldctx=False, ids=None):
autouse=False, yieldctx=False, ids=None, name=None):
self.scope = scope
self.params = params
self.autouse = autouse
self.yieldctx = yieldctx
self.ids = ids
self.name = name

def __call__(self, function):
if isclass(function):
Expand All @@ -129,7 +130,7 @@ def __call__(self, function):
return function


def fixture(scope="function", params=None, autouse=False, ids=None):
def fixture(scope="function", params=None, autouse=False, ids=None, name=None):
""" (return a) decorator to mark a fixture factory function.
This decorator can be used (with or or without parameters) to define
Expand All @@ -155,14 +156,21 @@ def fixture(scope="function", params=None, autouse=False, ids=None):
so that they are part of the test id. If no ids are provided
they will be generated automatically from the params.
:arg name: the name of the fixture. This defaults to the name of the
decorated function. If a fixture is used in the same module in
which it is defined, the function name of the fixture will be
shadowed by the function arg that requests the fixture; one way
to resolve this is to name the decorated function
``fixture_<fixturename>`` and then use
``@pytest.fixture(name='<fixturename>')``.
"""
if callable(scope) and params is None and autouse == False:
# direct decoration
return FixtureFunctionMarker(
"function", params, autouse)(scope)
"function", params, autouse, name=name)(scope)
if params is not None and not isinstance(params, (list, tuple)):
params = list(params)
return FixtureFunctionMarker(scope, params, autouse, ids=ids)
return FixtureFunctionMarker(scope, params, autouse, ids=ids, name=name)

def yield_fixture(scope="function", params=None, autouse=False, ids=None):
""" (return a) decorator to mark a yield-fixture factory function
Expand Down Expand Up @@ -1989,6 +1997,8 @@ def parsefactories(self, node_or_obj, nodeid=NOTSET, unittest=False):
# fixture attribute
continue
else:
if marker.name:
name = marker.name
assert not name.startswith(self._argprefix)
fixturedef = FixtureDef(self, nodeid, name, obj,
marker.scope, marker.params,
Expand Down
11 changes: 11 additions & 0 deletions testing/python/fixture.py
Original file line number Diff line number Diff line change
Expand Up @@ -2691,3 +2691,14 @@ def test_1(arg1):
*def arg1*
""")

def test_custom_name(self, testdir):
testdir.makepyfile("""
import pytest
@pytest.fixture(name='meow')
def arg1():
return 'mew'
def test_1(meow):
print(meow)
""")
result = testdir.runpytest("-s")
result.stdout.fnmatch_lines("*mew*")

0 comments on commit 0cacdef

Please sign in to comment.