我正在使用django框架工作进行一些应用程序测试, 我有一个案例,我测试非活动用户是否可以登录,我喜欢这样
self.testuser.is_active = False
//DO testing
self.testuser.is_active = True
//Proceed
我的问题是, 通过使用PEP343提供的上下文管理器 我试图这样做,但我失败了
with self.testuser.is_active = False :
//code
然后我试着做
with self.settings(self.__set_attr(self.testuser.is_active = False)):
//code
它也失败了
有办法解决这个问题吗?或者我必须定义一个将is_active设置为false的函数吗?
答案 0 :(得分:0)
您必须编写自己的上下文管理器。这是针对您的案例(使用contextlib):
import contextlib
@contextlib.contextmanager
def toggle_active_user(user):
user.is_active = False
yield
user.is_active = True
with toggle_active_user(self.testuser):
// Do testing
更好的方法是先保存状态然后恢复:
import contextlib
@contextlib.contextmanager
def toggle_active_user(user, new_value):
previous_is_active = user.is_active
user.is_active = new_value
yield
user.is_active = previous_is_active
with toggle_active_user(self.testuser, False):
// Do testing
答案 1 :(得分:0)
这是一个从contextlib构建的更通用的上下文管理器。
from contextlib import contextmanager
@contextmanager
def temporary_changed_attr(object, attr, value):
if hasattr(object, attr):
old = getattr(object, attr)
setattr(object, attr, value)
yield
setattr(object, attr, old)
else:
setattr(object, attr, value)
yield
delattr(object, attr)
# Example usage
with temporary_changed_attr(self.testuser, 'is_active', False):
# self.testuser.is_active will be false in here