如何在Python单元测试中模拟类变量值?

4 投票
3 回答
22667 浏览
提问于 2025-04-17 08:33

假设我有一个类:

class A():
  def f(self):
    self._v = 1

我尝试过:

m=Mocker()
A.f._v = m.mock()
...

但是没有成功。我不太确定该怎么做...

3 个回答

3

我尝试了上面的解决方案,但仍然没有达到我最初想要的效果。上面的方法会把我类中的某个属性更新为一个特定的值。

我的需求是从我在单元测试类中提供的模拟值来设置这个属性的值。

我最终通过以下方法解决了这个问题。如果这个方法不对,请告诉我:

实际类:

class ActualClass(object):
    name=''

    def some_method(self):
        name=get_name_from_external_source()  #Say, returned name='ActualValue' 
        print name 

单元测试类:

from mock import PropertyMock
import unittest
class TestActualClass(unittest.TestCase):
    def test_some_method(self):
        actual_class=ActualClass()
        p=PropertyMock(return_value='Mocked_Name')
        type(actual_class).name=p
        actual_class.some_method()

当你正常执行 ActualClass 中的某个方法时,输出结果是:

ActualValue

当你运行 TestActualClass 时,输出结果是:

Mocked_Name

这意味着类的属性是用模拟值进行了替换,你可以用这个模拟值来测试方法,而不必担心外部方法的调用。

4

这个类的定义展示了一个实例变量,可以从这个类外部进行设置,像这样做:

class A:
  def f(self):
    self._v = 1

a = A()
a._v = Mock()

如果你真的想要一个真正的类变量,可以试试这个:

class A():
  _v = None
  def f(self):
    self.__class__._v = 1

A._v = Mock()
4

你是不是想说Mock库?

from mock import Mock
real = ProductionClass()
real.method = Mock(return_value=3)
real.method(3, 4, 5, key='value')

编辑:

你在模拟之前试图访问A.f._v,这是不可能的。 不太确定你想做什么,但这样做是可行的。

>>>A.f = Mock()
>>>a = A()
>>>a.f._v
<Mock name='mock._v' id='42076240'>

撰写回答