簡體   English   中英

在Python中,如何模擬ac擴展類?

[英]In Python, how to mock a c extension class?

我正在嘗試模擬一個在其中使用ac擴展類的類函數,但出現TypeError: can't set attributes of built-in/extension type 'y.cExtensionClass' code.py是一個遺留代碼,我真的不希望對其進行更改。 有什么建議嗎?

code.py:

from x.y import cExtensionClass

class CodeClass():

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

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

謝謝

你可以試試禁果

禁果

在此處輸入圖片說明

這個項目旨在幫助您在編寫測試時走上天堂,但是如果在生產代碼上使用它可能會使您陷入困境。

它基本上允許您修補通過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"

補丁code.cExtensionClass (不是xycExtensionClass )。 不要from code cExtensionClass import code

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

替換整個cExtensionClass對象,而不是替換它的單個方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM