python模拟异常处理

时间:2017-12-06 23:41:12

标签: python

我的工作流程中有几个任务。现在,我想模拟Task1返回异常的输出,只是测试task2.run方法没有被调用。

class Task1():
    def run(self):
        try:
            return 2,2
        except Exception as e:
            print e
            raise Exception('Task1 Exception')

class Task2():
    def run(self,x,y):
        try:
            return 2 * (x*y)
        except Exception as e:
            print e
            raise Exception('Task2 Exception')            

class Workflow():
    def run(self,task1, task2):
        x,y = task1.run()
        print task2.run(x,y)


task1 = Task1()
task2 = Task2()

w = Workflow()
w.run(task1,task2)

这是我的单位测试 -

import unittest
import mock
from test2 import Task1, Task2, Workflow
class TestWorkflow(unittest.TestCase):
    def test_workflow(self):
        self.task1 = mock.MagicMock(Task1()) # mocking task1
        self.task2 = mock.MagicMock(Task2())
        self.task1.side_effect = Exception() # setting task1 exception to an exception object

        self.workflow = Workflow()
        self.workflow.run(self.task1, self.task2)
        self.task2.run.assert_not_called() # checking task2 is not called.


if __name__ == '__main__':
    unittest.main()

例外: -

    x,y = task1.run()
ValueError: need more than 0 values to unpack

1 个答案:

答案 0 :(得分:1)

鉴于语法,您使用的是Python 2,但我将参考Python 3 official documentation anyway.中的文档,我相信该解决方案适用。

第一个例子是:

from unittest.mock import MagicMock

thing = ProductionClass()
thing.method = MagicMock(return_value=3)
thing.method(3, 4, 5, key='value')
#prints 3

thing.method.assert_called_with(3, 4, 5, key='value')

提出您的问题,您将获得以下代码而不是当前代码。看到我将Task1.run和Task2.run方法分配给MagicMock实例。

import unittest
import mock
from t import Task1, Task2, Workflow
class TestWorkflow(unittest.TestCase):
    def test_workflow(self):
        self.task1 = Task1()
        self.task1.run = mock.MagicMock() # mocking run from task1
        self.task2 = Task2()
        self.task2.run = mock.MagicMock()
        self.task1.run.side_effect = Exception() # setting task1 exception to an exception object

        self.workflow = Workflow()
        self.workflow.run(self.task1, self.task2)
        self.task2.run.assert_not_called() # checking task2 is not called.


if __name__ == '__main__':
    unittest.main()