py.test и контекстный менеджер в django

Я пытаюсь использовать следующий менеджер контекста в тесте:

class APITest(TestCase):
    def create_scenario(self, user):
        # @pytest.yield_fixture
        @contextmanager
        def scenario():
            if user is not None:
                self.client.login(username=user.username, password='password')
            yield
            if user is not None:
                self.client.logout()
        return scenario

    def setUp(self):
        self.user = UserFactory.create()
        self.non_auth_scenario = self.create_scenario(None)
        self.auth_scenario = self.create_scenario(self.user)

    def test_foo_get(self):
        with self.non_auth_scenario:
            assert self.client.get('/api/foo/', format='json').status_code == 401
        with self.auth_scenario:
            assert self.client.get('/api/foo/', format='json').status_code == 200

Я получаю следующий результат:

    def test_widget_get(self):
\>       with self.non_auth_scenario:
E       AttributeError: __exit__

Я посмотрел на pytest.yield_fixture но у меня нет шансов. Есть идеи, пожалуйста?

1 ответ

Решение

При использовании менеджера контекста вам нужно вызвать его:

self.non_auth_scenario():

Общий случай:

>>> from contextlib import contextmanager
>>> @contextmanager
... def user(name):
...    print 'hello', name
...    yield
... 
>>> with user('world'):
...    pass
... 
hello world

И это вызовет ту же ошибку, что и вы:

>>> with user:
...    print 'well'
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: __exit__
Другие вопросы по тегам