Python:在数组中使用的模拟补丁模块

时间:2014-08-11 20:50:00

标签: python

这是我的方法:

def _eda_workflow(self, workflow_id, account_id):
    uuids = [str(uuid.uuid4()) for x in range(2)]

    return {
        'id': workflow_id,
        'root': uuids[0],
        'accountId': account_id,
        'steps': [
            {
                'this': uuids[0],
                'next': [uuids[1]],
                'type': 'on-contact-signed-up',
                'displayName': 'Sign Up',
                'constraints': {},
            },
            {
                'this': uuids[1],
                'prev': uuids[0],
                'next': [],
                'type': 'on-time-elapsed',
                'displayName': 'Send the email after delay or not!',
                'delay': 'PT0M',
                'sideEffect': {
                    'task': 'sendEmail',
                    'constraints': {},
                    'mailing_data': {},
                    'email': {}
                }
            }
        ]
    }

我遇到的问题是我写这个

def generate_uuids():
    return ["10e6e848-dc77-4057-890e-5acd4ed9aeb3", "d8d501a7-f7e7-4423-921c-e0f39b7e1301"]

@mock.patch('path.to.uuid')
def test_translte_workflow(self, uuid_mock):
   uuid_mock.uuid4.side_effect = generate_uuids

返回方法返回list个值而不是我期望的值。不确定如何正确编写此测试

3 个答案:

答案 0 :(得分:3)

副作用仅用于指定在调用mock时发生的其他内容。我认为这更像是你在寻找的东西:

def fake_uuid4():
    yield "10e6e848-dc77-4057-890e-5acd4ed9aeb3"
    yield "d8d501a7-f7e7-4423-921c-e0f39b7e1301"

@mock.patch('path.to.uuid.uuid4', fake_uuid4().next)
def test_translte_workflow(self):
   ...

答案 1 :(得分:1)

您的generate_uuids函数正在返回UUID的列表,这就是您所获得的内容。

如果要创建一个从正好两个 UUID池中一次返回一个UUID的函数,请从两个UUID列表中创建iterator并返回{{ 1}}来自那个功能。如果您还想对这些UUID进行断言,请将它们与迭代器分开存储:

iterator.next()

一旦耗尽该迭代器(在获取两个元素之后),它将引发import mock import unittest import uuid TEST_UUIDS = ["10e6e848-dc77-4057-890e-5acd4ed9aeb3", "d8d501a7-f7e7-4423-921c-e0f39b7e1301"] uuid_pool = iter(TEST_UUIDS) def generate_uuid(): return uuid_pool.next() def func(): uuid_1 = uuid.uuid4() uuid_2 = uuid.uuid4() return [uuid_1, uuid_2] class TestUUIDs(unittest.TestCase): @mock.patch('uuid.uuid4', generate_uuid) def test_uuid_mock(self): actual = func() expected = TEST_UUIDS self.assertEquals(expected, actual) unittest.main()

如果你想创建一个总是只从一个UUID流中返回一个UUID的函数,你可以使用itertools.cycle

StopIteration

答案 2 :(得分:1)

我需要解决类似问题,经过一些实验后,首选使用@patchside_effect的迭代。在我的例子中,我没有填充数组,而是填充了一个名为比我测试中的函数更深的层的函数的返回值。

TEST_UUIDS = ["10e6e848-dc77-4057-890e-5acd4ed9aeb3",
              "d8d501a7-f7e7-4423-921c-e0f39b7e1301"]
TEST_UUID_POOL = iter(TEST_UUIDS)

@patch('path.to.function1', side_effect=TEST_UUID_POOL)
def test_translate_workflow(self, uuid_mock):
    # function 1 is called twice in function2
    function2()