2014-10-31 2 views
1

OpenCV 모듈을 모의하기 위해 sys.modules['cv2'] = Mock()을 사용하고 있지만 변수가 전역 변수로 올바르게 설정되었는지 테스트하려면 assertEqual을 사용하는 데 문제가 있습니다. 코드를 단순화했습니다. 내 조롱이 맞는지 확실하지 않습니다.Python이 전역 변수를 조롱합니다

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()'그리고 나서'sys.modules [ 'cv2']'를 삭제하면 sys.modules [ 'cv2']'(조롱 된 객체) -별로 이해가 안되네 ... – alfasin

+0

나를 위해 조롱 후에 삭제를하는 것이 더 깔끔했습니다. 모든 opencv 함수는 가져 오는 동안 모의 객체입니다. 어쩌면 내가 틀렸어 –

+0

비웃음을당한 후 2 줄을 지우는거야 - 조롱 된 객체를 사용하지 않고 – alfasin

답변

1

싶은 것은 패치 var1입니다 할 수있는 가장 좋은 방법

여기 내 단위 테스트 파일입니다. 어쨌든, 난 당신이 내가 당신에게 몇 가지 솔루션을 제안하고있어하고 싶은 일에 대해 확실하지 않다 때문에 : 첫 번째 경우에 당신이 patch 맥락에서 MyClass의를 가져해야

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 

참고. 두 번째 예제는 모듈의 변수 만 패치됩니다.

첫 번째 예와 같이 패치를 사용하는 많은 메소드를 작성해야한다면 unittest 클래스의 클래스 데코레이터로 patch을 사용할 수 있습니다. 모든 테스트에서 cv2 함수를 패치합니다.

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

MagicMock도 확인하십시오.

관련 문제