Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何模拟多处理.Event.is_set()-AttributeError_Python_Python Unittest_Magicmock - Fatal编程技术网

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
的克隆