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

4

假设我有一个类:

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

尝试过:

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

但是没有成功。不确定如何操作...


2
不确定如何...做什么? - Chris Eberle
以上代码使用了实例变量,而不是类变量。 - Raymond Hettinger
同意@RaymondHettinger的观点,这个问题没有意义。如果您正在询问类变量,则应在类级别上定义它,而不是在实例方法内部定义。 - kdavh
3个回答

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'>

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

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中运行some_method时,输出为:
ActualValue

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接