2014-10-31 3 views
1

Я использую sys.modules['cv2'] = Mock(), чтобы высмеять модуль OpenCV, но у меня возникли проблемы с использованием assertEqual, чтобы проверить правильность настройки переменной с глобальной переменной. Я немного упростил код. Я не уверен, правильно ли насмехается.Python mocking global variable

Вот мой блок тестовый файл:

from mock import patch, Mock 
sys.modules['cv2'] = Mock() 
from MyClass import MyClass 
del sys.modules['cv2'] 

.... 

def testFunction() 
    myObject = MyClass() 
    self.assertEqual(myObject.val, ?) # here i don't know how to test the equality 

и файл MyClass.py:

import module 

val1 = cv2.function(1) 
val2 = cv2.function(2) 

class MyClass(): 
    def _init_(self) 
     self.val = val1 
+0

Если вы делаете 'sys.modules ['cv2'] = Mock()', а затем 'del sys.modules ['cv2']' вы удаляете 'sys.modules ['cv2']' (издевающийся объект) - не имеет большого смысла ... – alfasin

+0

Для меня было чище делать удаление после насмешки. Каждая функция opencv макет во время импорта. Может быть, я ошибаюсь –

+0

Вы удаляете 2 строки после насмешек - не используя насмешливый объект – alfasin

ответ

1

Может быть, лучший способ сделать то, что вы хотите сделать, это патч var1. Во всяком случае, потому что я не уверен, что вы хотите сделать, я предлагаю вам несколько решений:

from mock import patch 

@patch("cv2.function") 
def testfunction(mfun): 
    mfun.return_value = 200 
    import MyClass 
    MyObject = MyClass.MyClass() 
    assert MyObject.var == 200 


import MyClass 
print(MyClass.MyClass().var) #my cv2.function(1) stub return -1... but here you can see the real value 

@patch("MyClass.var1") 
def testfunction(mvar1): 
    mvar1 = 300 
    MyObject = MyClass.MyClass() 
    assert MyObject.var == 300 

Обратите внимание, что в первом случае вы должны импортировать MyClass в patch контексте. Второй пример - только переменная вашего модуля будет исправлена.

Если вы должны написать много методов, которые используют патч, как в первом примере, вы можете использовать patch как класс декоратора класса unittest: вы будете исправлять функцию cv2 во всех тестах.

0
class Chameleon(Mock): 
    def __eq__(self, other): 
     return True 

Также посмотрите на MagicMock.