2

我正在尝试模拟一个在其中使用 ac 扩展类的类函数,如下所示,但我得到TypeError: can't set attributes of built-in/extension type 'y.cExtensionClass'. code.py 是遗留代码,我真的不想更改它。有什么建议吗?

代码.py:

from x.y import cExtensionClass

class CodeClass():

    @staticmethod
    def code_function():
         cExtensionClass().cExtensionFunc()

测试.py:

import code
from x.y import cExtensionClass

class test(unittest.TestCase):

    def test_code_function(self)
        with patch.object(cExtensionClass, 'cExtensionFunc') as cExtensionFuncMock:   
            cExtensionFuncMock.return_value = None
            code.CodeClass.code_function()
            cExtensionFuncMock.assert_called_with()

谢谢

4

3 回答 3

3

补丁code.cExtensionClass(不是x.y.cExtensionClass)。做import code而不是from code cExtensionClass.

import unittest

from mock import patch, Mock

import code

class test(unittest.TestCase):
    def test_code_function(self):
        with patch('code.cExtensionClass') as m:
            m.return_value.cExtensionFunc = func = Mock()
            code.CodeClass.code_function()
            func.assert_called_with()

    #@patch('code.cExtensionClass')
    #def test_code_function(self, m):
    #    m.return_value.cExtensionFunc = func = Mock()
    #    code.CodeClass.code_function()
    #    func.assert_called_with()
于 2013-06-24T07:11:00.093 回答
2

你可以试试禁果

禁果

在此处输入图像描述

该项目旨在帮助您在编写测试时达到天堂,但如果在生产代码中使用它可能会导致您下地狱。

它基本上允许您修补内置对象,通过 python 在 C 中声明。像这样:

>>> from forbiddenfruit import curse
>>> def words_of_wisdom(self):
...     return self * "blah "
>>> curse(int, "words_of_wisdom", words_of_wisdom)
>>> assert (2).words_of_wisdom() == "blah blah "

繁荣!就是这样,你的 int 类现在有了 words_of_wisdom 方法。您想将类方法添加到内置类吗?没问题,只需这样做:

>>> from forbiddenfruit import curse
>>> def hello(self):
...     return "blah"
>>> curse(str, "hello", classmethod(hello))
>>> assert str.hello() == "blah"
于 2013-06-24T04:05:58.760 回答
0

替换整个 cExtensionClass 对象,而不仅仅是它的单个方法。

于 2013-06-24T03:29:36.030 回答