首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python -如何正确模拟类方法中的cls参数以引用静态变量

Python -如何正确模拟类方法中的cls参数以引用静态变量
EN

Stack Overflow用户
提问于 2018-07-15 06:02:44
回答 1查看 948关注 0票数 1

背景

相对较新的Python和它的unittest模块。在测试中模拟静态类变量时遇到问题。

(仅当原始类方法通过其第一个参数:cls引用其自己的类变量时)

示例:

正在测试的类和类方法的简化版本:

代码语言:javascript
复制
a.py
class A:
  # class variable
  my_list = []

  @classmethod
  def my_method(cls, item):
    print cls  # []  unable to mock this, why?
    print A    # [1,2,3] mocked as intended
    cls.my_list.append(item)

测试:

代码语言:javascript
复制
import unittest
from mock import patch
from a import A

class Test(unittest.testCase):
  def test_my_method(self):
    with patch("a.A") as mock_A:

      # mocking the class variable
      mock_A.my_list = [1,2,3]

      # test call class method
      A.my_method(4)

      # assert the appended list to expected output
      self.assertEqual(mock_A.my_list, [1,2,3,4])
      # should evaluate to true, but  fails the test

if __name__ == "__main__":
  unittest.main()

问题

为什么模拟只修补A引用而不修补cls reference?

  • In,为了成功修补cls参数,解决方案应该朝哪个方向发展,这样类方法才能通过上面显示的测试。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-15 06:17:50

您已经在测试模块中导入了A,因此您已经有了对原始的未打补丁的A的引用,这就是您所说的my_method on。

  1. 为什么模拟只修补A引用而不是cls引用?

因为那是你打的补丁。Patch通过拦截名称查找来工作,它不会(也不能)直接在适当的地方替换对象。当您想修补具有多个名称的对象(在本例中为Acls )时,则必须修补每个名称查找。

  1. 为了成功修补cls参数,解决方案应该朝哪个方向发展,这样类方法才能通过上面所示的测试。

直接修补class属性会更好:

代码语言:javascript
复制
class Test(unittest.TestCase):

  def test_my_method(self):
      with patch("a.A.my_list", [1,2,3]):
          A.my_method(4)
          self.assertEqual(A.my_list, [1,2,3,4])
      self.assertEqual(A.my_list, [])  # note: the mock is undone here
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51343726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档