diff --git a/_pytest/mark.py b/_pytest/mark.py index 5ded0afe8..74473a9d7 100644 --- a/_pytest/mark.py +++ b/_pytest/mark.py @@ -335,6 +335,17 @@ class MarkDecorator: def __repr__(self): return "" % (self.mark,) + def with_args(self, *args, **kwargs): + """ return a MarkDecorator with extra arguments added + + unlike call this can be used even if the sole argument is a callable/class + + :return: MarkDecorator + """ + + mark = Mark(self.name, args, kwargs) + return self.__class__(self.mark.combined_with(mark)) + def __call__(self, *args, **kwargs): """ if passed a single callable argument: decorate it with mark info. otherwise add *args/**kwargs in-place to mark information. """ @@ -348,9 +359,7 @@ class MarkDecorator: store_legacy_markinfo(func, self.mark) store_mark(func, self.mark) return func - - mark = Mark(self.name, args, kwargs) - return self.__class__(self.mark.combined_with(mark)) + return self.with_args(*args, **kwargs) def get_unpacked_marks(obj): diff --git a/changelog/2540.feature b/changelog/2540.feature new file mode 100644 index 000000000..d65b1ea56 --- /dev/null +++ b/changelog/2540.feature @@ -0,0 +1 @@ +Introduce ``mark.with_args`` in order to allow passing functions/classes as sole argument to marks. \ No newline at end of file diff --git a/testing/test_mark.py b/testing/test_mark.py index f3966d733..cc46702a5 100644 --- a/testing/test_mark.py +++ b/testing/test_mark.py @@ -22,6 +22,19 @@ class TestMark(object): mark = Mark() pytest.raises((AttributeError, TypeError), mark) + def test_mark_with_param(self): + def some_function(abc): + pass + + class SomeClass(object): + pass + + assert pytest.mark.fun(some_function) is some_function + assert pytest.mark.fun.with_args(some_function) is not some_function + + assert pytest.mark.fun(SomeClass) is SomeClass + assert pytest.mark.fun.with_args(SomeClass) is not SomeClass + def test_pytest_mark_name_starts_with_underscore(self): mark = Mark() pytest.raises(AttributeError, getattr, mark, '_some_name')