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

And*_*ius 6 python mocking python-mock python-unittest

考虑这个例子:

模块.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)
Run Code Online (Sandbox Code Playgroud)

测试.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())
Run Code Online (Sandbox Code Playgroud)

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

是否可以只修改一次,然后将其重用于所有方法?所以我不需要LST.x = [2]在每个方法调用上重复自己的操作?

Sra*_*raw 8

怎么样:

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())
Run Code Online (Sandbox Code Playgroud)

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

  • 为了完整起见,我建议在“tearDownClass”上添加“super”,因为如果您在不调用 super 的情况下覆盖“tearDownClass”,在相同情况下可能会导致意想不到的后果。 (2认同)