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__