2014-11-24 2 views
0

나는 방법 calculate_ticket와 클래스 SocketHandler 있습니다 클래스를 인스턴스화하지 않고 메서드를 단위 테스트 할 수 있습니까?

class SocketHandler(A, B, C ..): 
    .. 

    calculate_ticket(self, key): 
     .. 
     return ticket 

    .. 

지금 나는 그것이 너무 많은 것들과 결합되어 있기 때문에 클래스의 인스턴스를하지 않고 방법을 테스트하려는. 이것이 가능한가? 나는 서브 클래스에서 오버라이드 (override) __init__을하고 생각할 수

+0

@vaultah 그게 내가 찾고있는 것입니다. 이것을 우회하는 해킹 방법이있을 수 있습니다. – Pithikos

+0

저는 여러분이 아마 인스턴스를 조롱 할 수 있다고 생각합니다. 실제 메소드가 될 모의 인스턴스에서이 메소드의 부작용을 지적하십시오. 시도하지 않았지만 작동 할 수도 있습니다. –

답변

1

주요 해키 방법 : 심지어는 단위 테스트에서 손으로해야한다고 속성을 설정할 수 있습니다

class FakeSocketHandlerForTesting(SocketHandler): 
    def __init__(self, *args, **args): 
     pass 

.

여전히 커플 링을 줄이는 것이 좋습니다.

+0

멋지고 빠르고 간단한 솔루션! 그러나 매개 변수로'self'와'* args' 만 있으면 충분합니다. – Pithikos

4

mock 라이브러리를 사용하는 방법에는 여러 가지가 있습니다. 한 가지 간단한 방법은 인스턴스 자체를 조롱 한 다음 "긴"형식을 사용하여 메서드를 호출하는 것입니다.

class ClassToTest(object): 
    def __init__(self): 
     pass 

    def method_to_test(self, y): 
     self.x = y 
     return 5 

fake_instance = mock.Mock() 
ClassToTest.__init__(fake_instance) 
x = ClassToTest.method_to_test(fake_instance, 3) 
assert x == 5 
assert fake_instance.x == 3 
관련 문제