Python: ложное возвращаемое значение параметра, переданного по ссылке на библиотеку C - PullRequest
0 голосов
/ 09 октября 2018

У меня есть библиотека C, для которой я пишу оболочку.Большинство функций в этой библиотеке принимают «аргументы out» (результат возвращается в переданной переменной).Итак, как мне протестировать случай, когда: - self._system вернулась как None (из C как побочный эффект), но - функция возвращает успех

Пожалуйста, смотрите код ниже для получения более подробной информации

main.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 Ответ

0 голосов
/ 18 октября 2018
  • Создание функции с такой же сигнатурой, как у функции C.
  • Назначение этой функции для побочного эффекта макета.

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