2011-12-01 2 views
0

조롱하는 사람과 함께 함수 폼을 테스트 클래스의 다른 함수에 전달하고 함수가 반환 된 후에 조롱 될 것으로 기대합니다. 그러나, 그것은 작동하지 않는 것, 그리고 어떤 제안 주셔서 감사합니다!우리는 조롱을위한 함수와 조롱을 다른 함수에 전달할 수 있습니까?

class Cls(): 
    def submthd(self): 
     return 0 
    def mthd(self): 
     a=self.submthd() 
     return a 

class Test_me(MockerTestCase): 
    def setUp(self): 
     pass 

    def mockup(self,f,m): 
     f = m.mock() 
     f(ARGS) 
     m.result(1) 
     m.replay() 

    def test_null(self): 
     m=Mocker() 
     o=Cls() 
     self.mockup(o.submthd,m) 
     self.assertEqual(o.mthd(),1) 
     m.verify() 
+0

'F를 = m.mock (f)'? –

답변

0

내가 착각 할 수도 있지만, 당신이 할 노력하고하는 것은 파이썬 조롱하는 용어로 "Patching"라고 나에게 보인다. 기존 인스턴스 인 Cls()에서 submthd() 호출의 동작을 변경하려고합니다.

먼저 new style classes (예 : object의 하위 클래스)을 사용해야합니다. 그럼 Cls()을 다시 정의하자 : 나는 여러 방법에 mockup(...) 방법을 사용하는 방법을 보여 submthd2mthd2을 추가 한하지만, 그 클래스는 본질적으로 변하지

class Cls(object): 
    def submthd(self): 
     return 0 
    def mthd(self): 
     return self.submthd() 
    def submthd2(self): 
     return 0 
    def mthd2(self): 
     return self.submthd() 

.

지금, 당신의 테스트 케이스에 패치를 사용하기 위해서는 당신이 이런 짓을 할 것이다 :

class Test_me(MockerTestCase): 
    def mockup(self, p, f, m): 
     methodToCall = getattr(p, f) 
     methodToCall() 
     m.result(1) 

    def test_null(self): 
     m = Mocker() 
     o = Cls() 
     p = m.patch(o) 
     self.mockup(p, 'submthd', m) 
     self.mockup(p, 'submthd2', m) 
     m.replay() 
     self.assertEqual(o.mthd(), 1) 
     self.assertEqual(o.mthd2(), 1) 
     m.verify() 

내가 단위 테스트로이 코드를 실행하면 내가 얻을 :

. 
---------------------------------------------------------------------- 
Ran 1 test in 0.002s 

OK 
+0

정말 작동하지만 소스 코드를 변경할 수 없으므로 어쨌든 객체의 하위 클래스를 만들지 않고이 문제를 해결할 수 있습니까? –

+0

[이 질문에 대한 내 대답을 참조하십시오 (http://stackoverflow.com/questions/8347573/why-this-mocking-script-doesnt-work-unittest-mocker-python) 여기서 나는 당신이 클래스의 경우 거래 테스트는 객체의 하위 클래스가 아닙니다. – srgerg

관련 문제