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

2024-05-17 06:24:45 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有课:

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

尝试过:

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

但没用。不知道怎么。。。


Tags: selfdefmockclassmocker
3条回答

你是说Mock library

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

编辑:

你在模仿之前试图进入A.f.\U v,这是不可能的。 不知道你想做什么,但这会奏效的

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

类定义显示了一个实例变量,用于从类外部设置该变量,请执行以下操作:

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()

我尝试了以上的解决方案,但仍然不能解决我的目的,这正是最初所要求的。上面的方法将更新类的mocked属性,使其值为。

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

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

实际等级:

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

这意味着类属性是使用PropertyType的模拟值模拟的,您可以使用模拟值测试方法,而不必担心外部源方法调用。

相关问题 更多 >