代码之家  ›  专栏  ›  技术社区  ›  hamaney

Python:通过引用传递给C库的参数的模拟返回值

  •  0
  • hamaney  · 技术社区  · 6 年前

    那么,在以下情况下,我该如何测试该案例: -self.\u系统返回为None(作为副作用从C返回),但是

    主.py

    myLibDLL = CDLL('mylib.dll')
    
    class System():
        _system = None
    
        def __init__(self):
            self._system = c_void_p(None)
    
        def GetSys(self):
            # - The C function prototype 
            #       ERROR_CODE XXX_API CGetSys(void* phSys)
            # - myLibDLL.CGetSys() is the call to mock
            retErr = myLibDLL.CGetSys(byref(self._system))
            checkReturnErr(retErr)
    
            if self._system.value == None:
                raise BaseException('Failed to Get Sys') # case to test
    

    @patch("main.myLibDLL.CGetSys")
    def test_GetSys_sysIsNone_afterCGetSysisCalled(self, mock_CGetSys):
        self.sys = System()
    
        # What expectations shoudl I set here?
        mock_CGetSys.return_value = 0 # to pass checkReturnErr()        
        mock_CGetSys.??? = None # the question 
    
        # test
        with self.assertRaises(BaseException):
            self.system.GetSys()
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   hamaney    6 年前
    • 创建一个与C函数具有相同签名的函数。
    • 将该函数指定给mock的副作用。

      def nullifyCSysPtr(cSysPtr):
          # assigne None to c_void_p type
          cSysPtr._obj.value = None
      
      @patch("main.myLibDLL.CGetSys")
      def test_GetSys_sysIsNone_afterCGetSysisCalled(self, mock_CGetSys):
          # moking
          mock_CGetSys.return_value = 0 # to pass checkReturnErr()        
          mock_CGetSys.side_effects = nullifyCSysPtr # the answer
      
          # test
          with self.assertRaises(BaseException):
              self.sys = System()
              self.system.GetSys()