2012-11-30 3 views
1

알았어, 분명히 알겠지만 내부 함수에 대한 테스트를 작성하는 법을 배울 수는 없다. 문제를 설명하기위한 간단한 코드가 있습니다. "진짜"경우파이썬 unittest - 호출 가능 함수를 참조하는 방법

Exception: NameError: global name 'low' is not defined 

에서

def high(x, y): 
    def low(x): 
     return x*2 
    return y*low(x) 

class TestHigh(unittest.TestCase): 
    def test_high(self): 
     self.assertEqual(high(1,2),4) 

    def test_low(self): 
     self.assertEqual(low(3),6) 

결과는 내가 모든 경로 만 테스트 할 때 성가신 인 행사하고 있는지 확인하기 위해 단독으로 낮은 수준의 기능을 테스트 할 수 있도록하려면 높은 수준에서.

답변

2

낮음은 상위 함수 내에 중첩되어 있으므로 함수 외부에서는 액세스 할 수 없습니다. 귀하의 기능에 상응하는 것이 high(3,1)

2

공개적으로 표시되는 인터페이스가 해당 사양에 따라 작동하는지 테스트를 작성합니다. 노출되지 않은 내부 기능에 대한 테스트를 작성하지 마십시오.

low()의 결과를 통해 high()의 결과를 완전히 테스트 할 수없는 경우 low()의 테스트되지 않은 부분은 외부에 관계가 없습니다.

+0

여기 내 변명이 있습니다. 나는 깔끔하게 보이는 WingIDE의 리펙토링에 빠져들지 만 중첩 된 함수가 개별적으로 테스트 할 수 없다면 실제로 도움이되지 않습니다. 먼저 테스트 할 수있는 부분에 쓰면 여기서 배우는 것처럼 보입니다. 많은 감사합니다. –

1

배드 : 클래스를 만들고 메소드 (또는 정적 함수)로 함수를 추가해보십시오.

좋은 (. 내가하지 말아야 할 무엇에 대한 참조로 여기 떠날거야) : 모듈 레벨 함수를 작성하거나 당신이 만약 둥지 그것을 테스트 할 수 없음에 동의합니다.

+4

하지 마십시오. 이것은 Java가 아닙니다. 여기서 클래스를 만들 필요는 없으며 정적 메서드를 사용하는 데는 거의 이유가 없습니다 (네임 스페이스 지정, 클래스 메서드가 동등하거나 그 이상). 모듈 수준의 기능 만 사용하면됩니다. – delnan

관련 문제