2012-12-04 5 views
1

내 장고 애플리케이션에 여러 TestCase 클래스가 있습니다. 그 중 일부에서는 클래스를 @ mock.patch로 장식하여 외부 리소스를 호출하는 함수를 조롱합니다. 내 테스트 스위트에있는 하나의 TestCase를 B()라고 부르 자. 외부 리소스에 따라 다르므로 내가 조롱 당하고 싶지 않고 데코레이터를 추가하지 않기를 바란다. 다음과 같이 보입니다.장고 (Django) 단위 테스트에서 조롱 된 객체 잠금 해제

@mock.patch("myapp.external_resource_function", new=mock.MagicMock) 
class A(TestCase): 
    # tests here 

class B(TestBase): 
    # tests here which depend on external_resource_function 

내가 독립적으로 B를 테스트 할 때 예상대로 작동합니다. 그러나 두 테스트를 동시에 실행하면 A가 먼저 실행되지만 함수는 여전히 B에서 조롱을받습니다. 어떻게 호출을 숨길 수 있습니까? 모듈을 다시로드하려고 시도했지만 도움이되지 않았습니다.

답변

5

패치의 크기는 start and stop methods입니다. 제공 한 코드에서 볼 수있는 것을 토대로 데코레이터를 제거하고 클래스의 링크에있는 setUp 및 tearDown 메소드를 사용합니다.

class A(TestCase): 
    def setUp(self): 
    self.patcher1 = patch('myapp.external_resource_function', new=mock.MagicMock) 
    self.MockClass1 = self.patcher1.start() 

    def tearDown(self): 
    self.patcher1.stop() 

    def test_something(self): 
    ... 

>>> A('test_something').run() 
+1

감사합니다. 시작과 중지가 필요합니다. – velotron

+1

하나의 테스트에 모의가 필요한 경우, 다른 테스트에는 모의가 필요한 경우 어떻게해야합니까? 각 단위 테스트 내에서 패치/시작/중지하는 것보다이 작업을 수행 할 수있는 다른 방법이 있습니까? – Ethereal

0

좋은 답변입니다. Ethereal의 질문과 관련하여, 패치 객체는 사용에있어 매우 유연합니다.

다른 패치가 필요한 테스트에 접근하는 한 가지 방법이 있습니다. 여전히 setUp 및 tearDown을 사용할 수는 있지만 patch.start/stop 비트는 수행 할 수 없습니다.

각 테스트에서 패치를 시작하고 finally 절을 사용하여 중지 된 상태인지 확인합니다().

패치는 Context Manager 항목도 지원하므로 다른 옵션이 있습니다 (여기에 표시되지 않음).

class A(TestCase): 
    patcher1 = patch('myapp.external_resource_function', new=mock.MagicMock) 
    patcher2 = patch('myapp.something_else', new=mock.MagicMock) 


    def test_something(self): 

     li_patcher = [self.patcher1] 
     for patcher in li_patcher: 
      patcher.start() 


     try: 
      pass 
     finally: 
      for patcher in li_patcher: 
       patcher.stop() 


    def test_something_else(self): 

     li_patcher = [self.patcher1, self.patcher2] 
     for patcher in li_patcher: 
      patcher.start() 

     try: 
      pass 
     finally: 
      for patcher in li_patcher: 
       patcher.stop() 
관련 문제