Python:所有测试方法都只模拟一次补丁类?

时间:2019-08-22 06:30:05

标签: python mocking python-unittest python-mock

考虑以下示例:

module.py:

class LST:
    x = [1]


class T:
    def __init__(self, times):
        self.times = times

    def t1(self):
        return LST.x * self.times

    def t2(self):
        return LST.x * (self.times+1)

    def t3(self):
        return LST.x * (self.times+2)

test.py:

from mock import patch

import unittest
import module


@patch('module.LST')
class TestM(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        super(TestM, cls).setUpClass()
        cls.t = module.T(1)

    def test_01(self, LST):
        LST.x = [2]
        self.assertEqual([2], self.t.t1())

    def test_02(self, LST):
        LST.x = [2]
        self.assertEqual([2, 2], self.t.t2())

    def test_03(self, LST):
        LST.x = [2]
        self.assertEqual([2, 2, 2], self.t.t3())

我只想用补丁修改LST类,因为同一修改将用于所有测试。

是否只能修改一次,然后将其重新用于所有方法?因此,我不需要在每个方法调用上都进行LST.x = [2]来重复自己吗?

1 个答案:

答案 0 :(得分:2)

怎么样:

from mock import patch

import unittest
import module


class TestM(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        super(TestM, cls).setUpClass()
        cls.t = module.T(1)
        cls.patcher = patch('module.LST')
        LST = cls.patcher.start()
        LST.x = [2]

    @classmethod
    def tearDownClass(cls):
        cls.patcher.stop()

    def test_01(self):
        self.assertEqual([2], self.t.t1())

    def test_02(self):
        self.assertEqual([2, 2], self.t.t2())

    def test_03(self):
        self.assertEqual([2, 2, 2], self.t.t3())

基本思想是您可以手动控制修补行为。