2017-11-02 3 views
0

나는 최근에 TDD 과정을 밟아 왔고, 학습을 실천하려고 노력해 왔습니다. 일부 json 문서를 처리하기 위해 코드 작업을 수행했으며, 약간의 처리를 수행하는 함수가 포함 된 다음 다른 함수를 호출하여 작업의 일부를 수행합니다.파이썬에서의 TDD : 함수에 대한 의존성 주입

그래서 클래스 내에서 함수 1은 함수 2를 호출하고 함수 3을 호출합니다. 함수 2를 모의하기 위해 의존성 주입을 사용했습니다. 그래서 함수 2가 함수 1에 의해 호출 된 방법에 대한 어설 션을 만들 수 있습니다 이것은 모의 함수를 함수 1에 대한 매개 변수로 전달하는 것을 포함하는데, 이는 함수를 독립적으로 개발할 때 잘 동작합니다. 그러나, 내가 독립적으로 테스트 한 모든 함수를 실제 문자열과 문자열로 함께 실행하려면 함께 문제가 발생합니다. 내 실제 함수를 전달하려고 할 때 작동하지 않는 것 같습니다. 아래 코드는 작동하지 않지만, 내가하려고하는 것을 잘 나타내줍니다.

class myclass: 

    def function1(self, number): 
     number = number + 1 
     self.function2(number) 

    def function2(self, number): 
     number = number + 2 
     print(number) 

instantiated_class = myclass() 
instantiated_class.function1(1) 

을하지만 분명히 그것은 더 어려워 기능이 호출 된 방식을 테스트 할 수 있습니다 :

class myclass: 

    def function1(self, number, injected_function=function2): 
     number = number + 1 
     injected_function(number) 

    def function2(self, number): 
     number = number + 2 
     print(number) 

instantiated_class = myclass() 
instantiated_class.function1(1) 

일반적으로, 나는 같은 것을 할 것입니다. 나는 unittest.mock.patch이이 시나리오에서 사용될 수 있다는 것을 알고 있지만 실제로이 모든 것에 대한 해결책입니까? 나는 근본적으로 잘못된 것을하고있는 것처럼 느껴진다. 나는이 TDD 것들로 잘못된 접근법을 가지고있다.

+0

어떻게 작동하지 않습니까? 오류 출력이 있습니까? – MrJLP

+0

@MrJLP 첫 번째 블록에서 코드를 실행하면 오류 유형이 표시됩니다. 나는 내가하고 싶은 것을 습득하기 위해 잘못된 유형의 디자인을 사용하고있다. 테스트 중에 모의 함수를 삽입하는 옵션이있다. 그렇지 않으면 디폴트 함수를 사용한다. – millsy

답변

0

어떤 오류가 발생하는지 질문에 추가하면 도움이됩니다.

파이썬 3.5로 코드를 실행하면 NameError: name 'function2' is not defined이됩니다.

문제는 function1 정의 시간이 function2에 아직 정의되지 않았습니다. function1 전에 신고하면

class myclass: 

    def function2(self, number): 
     number = number + 2 
     print(number) 

    def function1(self, number, injected_function=function2): 
     number = number + 1 
     injected_function(number) 

이 문제를 해결할 수 있습니다. 여기서 까다로운 점은 function2을 직접 참조하고 myclass을 통해 참조하지 않는다는 것입니다. 따라서 injected_function(number)에 전화하면 클래스에 바인딩되지 않습니다. 즉, self 매개 변수는 자동으로 제공되지 않으므로 function2self으로 전달 된 인수 number을 "확인"하고 두 번째 인수 인 number을 수신하지 못했다고 불만을 나타냅니다.

injected_function(self, number)으로 전화하여 문제를 해결할 수 있지만 더 많은 문제가 발생할 수 있습니다. 대신에이 같은 작업을 수행 할 수 있습니다

class myclass: 
    def function1(self, number, injected_function=None): 
     if injected_function is None: 
      injected_function = self.function2 
     number = number + 1 
     injected_function(number) 

    def function2(self, number): 
     number = number + 2 
     print(number) 

self 내부에서 찾을 수 function2에 대한 참조를 사용하고 있기 때문에이 작동합니다. 정의 시간에는 필요하지 않으므로 매개 변수 self은 메소드 호출에 바인딩됩니다. 동시에 메서드가 아닌 함수 (예 : self 매개 변수를 사용하지 않는 함수)를 제공하는 데 문제가 없습니다.