2012-11-07 4 views
0

몇 가지 기본 검사를 공유하는 일련의 작업이 있습니다. 내 코드는 다음과 같습니다.단위 테스트 래퍼

def is_valid(param): …some pretty complex things unit-tested on their own… 

class BaseAction(object): 
    def run(self, param): 
     if not is_valid(param): 
      raise ValueError(…) 

     return self.do_run(param) 

class Jump(BaseAction): 
    def do_run(self, param): … 

class Sing(BaseAction): 
    def do_run(self, param): … 

BaseAction.run이 유효성 검사를 수행한다는 사실을 어떻게 테스트해야합니까?

나는 단위 테스트 Jump.run과 Sing.run 수 있다고 생각하지만 제대로 할 수있는 BaseAction, 잠재적으로 꽤 많은 경우 각 하위 테스트를 작성해야 할 것. 또한 이것은 하위 클래스에 대한 테스트와 기본 클래스의 테스트를 결합하는 것을 의미합니다.

답변

2

is_valid() 함수 자체를 단위 테스트합니다. 이미 is_valid() 자체에 대한 유닛 테스트를 가지고 있기 때문에

with self.assertRaises(ValueError): 
    objectundertest.run(invalid_parameter) 

것은 .run()에 대한 unittests가이 기능의에 초점을 맞출 필요가 없습니다 : 당신 만 .run()ValueError 예외 통과 잘못된 입력을 올린다는 사실을 테스트해야합니다. .run() 고유의 기능에 집중할 수 있습니다.

귀하의 경우 BaseAction은 서브 클래스에 서비스를 제공하는 단위입니다. 나는 모의 서브 클래스로이 테스트 것 : run 참으로 기대 paramdo_run라고하면

class MockAction(BaseAction): 
    run_called = None 

    def do_run(self, param): 
     self.run_called = param 

은 그래서 당신은 확인할 수 있습니다.

+0

'피험자 확인'을 위해 내가 취해야 할 조치는 무엇입니까? BaseAction() (일종의 추상 클래스 일 수 있음)? 단일 하위 클래스 하나? – liori

+0

@liori : 조금 확장했습니다. 유닛 테스트를 위해서만'BaseAction()'을 서브 클래스하십시오. 따라서 기본 클래스 단위에 집중할 수 있습니다. –

1

논리를 기본 클래스에 유지하려면 Martijn Pieters 대답을 참조하십시오.

그러나 한 가지 가능성은 유효성 검사가 기본 클래스의 일부가 아닌 함수/클래스에서 발생하도록 코드를 재구성하는 것입니다. 어쩌면 사실 자체가 사람들을 확인 할 수있는 작업을 실행하는 클래스 ...

class Jump(object): 
    def run(self, param): 
     ... 

def run_action(action, param): 
    if not is_valid(param): 
     raise ValueError(…) 

    return action.run(param) 

단위 테스트 작업은 (당신이 기본 논리에 대해 걱정할 필요가 없습니다) 쉽게, 또한 중단되지 않습니다 모든 "BaseAction"이 어떻게 든 부서지면 "점프"단위 테스트. "run_action"(원하는 경우 함수 대신 클래스를 만들 수 있음) 자체를 매우 쉽게 테스트 할 수 있습니다 (가짜 "Action"객체를 만들 수 있음).

+0

예.이 공식은 더 명확하게 만듭니다. 고맙습니다. – liori