Python 如何模拟多处理.Event.is_set()-AttributeError
我试图模拟一个Python 如何模拟多处理.Event.is_set()-AttributeError,python,python-unittest,magicmock,Python,Python Unittest,Magicmock,我试图模拟一个多处理.Event对象,以便调用Event.is\u set()在第一次迭代时返回False,在第二次迭代时返回true。我在以下尝试中失败: import unittest import unittest.mock as mock import multiprocessing class MyClassUnderTest: def __init__(self): self.event = multiprocessing.Event()
多处理.Event
对象,以便调用Event.is\u set()
在第一次迭代时返回False,在第二次迭代时返回true。我在以下尝试中失败:
import unittest
import unittest.mock as mock
import multiprocessing
class MyClassUnderTest:
def __init__(self):
self.event = multiprocessing.Event()
# start a Process which immediately uses self.event
def my_method_under_test(self):
while not self.event.is_set():
pass # do something
return True
class TestMyClassUnderTest(unittest.TestCase):
@mock.patch.object(multiprocessing.Event, 'is_set', return_value=False)
def test_my_method(self, mock_event):
mock_event.side_effect = [False, True]
myobj = MyClassUnderTest()
self.assertTrue(myobj.my_method_under_test())
我最后得到了一个错误:
AttributeError: <bound method BaseContext.Event of <multiprocessing.context.DefaultContext object at 0x7f1068a50e48>> does not have the attribute 'is_set'
AttributeError:没有“已设置”属性
我无法覆盖
MyClassUnderTest.event
,因为事件对象会立即被使用,所以我试图覆盖整个多处理.event
类。下面是一种使用配置\u mock
的方法:
import unittest
import unittest.mock as mock
import multiprocessing
class MyClassUnderTest:
def __init__(self):
self.event = multiprocessing.Event()
# start a Process which immediately uses self.event
def my_method_under_test(self):
while not self.event.is_set():
pass # do something
return True
class TestMyClassUnderTest(unittest.TestCase):
@mock.patch('multiprocessing.Event')
def test_my_method(self, mock_event):
mock_event.configure_mock(**{'is_set.side_effect': [False, True]})
myobj = MyClassUnderTest()
self.assertTrue(myobj.my_method_under_test())
如果有人知道如何将它完全压缩成
@mock.patch(…)
,那仍然很有用。这里有一种方法可以使用配置\u mock
:
import unittest
import unittest.mock as mock
import multiprocessing
class MyClassUnderTest:
def __init__(self):
self.event = multiprocessing.Event()
# start a Process which immediately uses self.event
def my_method_under_test(self):
while not self.event.is_set():
pass # do something
return True
class TestMyClassUnderTest(unittest.TestCase):
@mock.patch('multiprocessing.Event')
def test_my_method(self, mock_event):
mock_event.configure_mock(**{'is_set.side_effect': [False, True]})
myobj = MyClassUnderTest()
self.assertTrue(myobj.my_method_under_test())
如果有人知道如何将其完全压缩为仍然有用的
@mock.patch(…)
。要响应@David Parks的呼叫,下面是一个简化的工作示例
导入单元测试
将unittest.mock导入为mock
导入多处理
类MyClassUnderTest:
定义初始化(自):
self.event=multiprocessing.event()
#启动一个立即使用self.event的进程
def my_方法_在_测试下(自我):
而不是self.event.is_set():
通过,做点什么
返回真值
类TestMyClassUnderTest(unittest.TestCase):
@mock.patch('multiprocessing.Event')
def测试我的方法(自我、模拟事件):
mock_event.is_set.side_effect=[假,真]
myobj=MyClassUnderTest()
self.assertTrue(myobj.my\u test()下的方法)
技巧是只在decorator中修补
事件
类,并在测试体中模拟is_set()
的响应。老实说,我不知道为什么我们不能直接修补多处理.Event.is\u set
,因为多处理.Event
是线程.Event
的克隆。为了响应@David Parks的调用,这里有一个简化的工作示例
导入单元测试
将unittest.mock导入为mock
导入多处理
类MyClassUnderTest:
定义初始化(自):
self.event=multiprocessing.event()
#启动一个立即使用self.event的进程
def my_方法_在_测试下(自我):
而不是self.event.is_set():
通过,做点什么
返回真值
类TestMyClassUnderTest(unittest.TestCase):
@mock.patch('multiprocessing.Event')
def测试我的方法(自我、模拟事件):
mock_event.is_set.side_effect=[假,真]
myobj=MyClassUnderTest()
self.assertTrue(myobj.my\u test()下的方法)
技巧是只在decorator中修补事件
类,并在测试体中模拟is_set()
的响应。老实说,我不知道为什么我们不能直接修补多处理.Event.is\u set
,因为多处理.Event
是线程.Event
的克隆