잘못된 접근 방법을 취하고 있습니다. 당신이하고 싶은 것은 당신의 외부 API 함수 호출로부터 고립 된 테스트를 실행하는 것이다. API 호출을 모의하기 만하면됩니다. 즉, mock 메소드로 대체 된 API 호출로 테스트를 실행하십시오. 테스트중인 코드를 변경할 필요가 없으며 패치 데코레이터를 사용하여 API 호출을 mock 객체로 바꿀 수 있습니다. unittest.mock
문서와 예제 here
unittest.mock
은 매우 강력 참조하십시오, 그리고 위협 또는 적어도 조금 시작 부분에 수수께끼 조금 볼 수 있습니다. 문서에서 mock으로 할 수있는 일의 종류를 이해하는 데 시간을 투자하십시오. 여기에, (일부 테스트 코드 단위) possibilites 중 하나의 매우 간단한 예 :
@patch('myproject.db.api.os.path.exists')
def test_init_db(self, mock_exists):
...
# my mock function call will always returns False
mock_exists.return_value = False
# now calls to myproject.db.api.os.path.exists
# in the code under test act just like the db file does not exist
...
그래서 당신은 아마 쉽게 외부 API 호출 (모두 또는 그 중 일부)를 무시할 수 있습니다. 원하지 않으면 API 결과를 지정할 필요가 없습니다. 모의는 "플라스틱"동작을 나타냅니다.
모의 객체를 만들고 임의의 모의 메소드를 호출하는 경우 (정의하고 있지 않은 API 메소드를 생각해보십시오) 해당 객체는 정상적으로 실행되어 다른 모의 객체를 반환합니다. 즉, 아무 것도하지 않지만 클라이언트 코드는 마치 실행 한 것처럼 실행됩니다. 따라서 테스트를 실행하여 원하는 부분을 실제로 비활성화 할 수 있습니다.
제 의견으로는 테스트 할 코드 조각을 자신의 함수로 추출해야합니다. 그런 식으로 관심있는 부분을 테스트 할 수 있습니다. – byxor