这是我的方法:
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
个值而不是我期望的值。不确定如何正确编写此测试
答案 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)
我需要解决类似问题,经过一些实验后,首选使用@patch
和side_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()