2012-04-12 2 views
5

테스트 스위트 (unittest가 아닌 nose를 사용)가 있으며 테스트 클래스의 모든 테스트에 대해 특정 값 시퀀스를 반환하는 함수를 패치하고 싶습니다. 간단한 예를 사용하여 내 첫 번째 시도가 있었다 : 부작용이 소진 될 때 두 번째 테스트가 실패되도록 모의를 사용하여 함수 패치하기

@patch('time.clock', MagicMock(side_effects=[1, 2])) 
class Tests: 
    def test_1(self): 
     assert time.clock() == 1 
     assert time.clock() == 2 

    def test_2(self): 
     assert time.clock() == 1 
     assert time.clock() == 2 

가 그러나 MagicMock 인스턴스 번만 생성된다. 나는 각 테스트 메소드를 개별적으로 패치 할 수 있지만, 실제로 모든 것을 통해 패치 데코레이터를 복제하고 싶지는 않습니다. (이 예제보다 훨씬 많은 테스트가 있습니다!) 다른 방법으로 내가 할 수있는 것은 패치를 만드는 것입니다.

class Tests: 
    def setup(self): 
     self.old_clock = time.clock 
     time.clock = MagicMock(side_effects=[1, 2]) 

    def teardown(self): 
     time.clock = self.old_clock 

    def test_1(self): 
     assert time.clock() == 1 
     assert time.clock() == 2 

    def test_2(self): 
     assert time.clock() == 1 
     assert time.clock() == 2 

원래 함수 정의를 저장하고 복원하는 것은 모의 작업이 자동으로 수행 할 수있는 것처럼 보입니다. 내가 누락 된 다른 방법이 있나요? 아니면 내 마지막 사례가 이것을하는 가장 좋은 방법인가?

답변

2
a = (x for x in [1,2]) 

x = lambda : next(a) 

x() 

아웃 : 1

x() 

아웃 : 2

A의 목록에 답을 넣습니다. 원하는 이름으로 X를 변경하십시오.

+0

당신이 여기에 있어요 무엇인지 전혀 모른다. 이 질문은 전혀 관련이없는 것처럼 보이며'x = [1, 2] .__ iter __(). next '라고하는 복잡한 방법처럼 보입니다. 당신은 무엇을 말하려고하는? – aquavitae

+0

잘. 당신은 모의 기능을 창조하는 방법을 원합니다. 이제 응답의 순서를 정하십시오. 아니? x = [ "첫 번째 응답", "두 번째 레스포", "... 등"] .__ iter __(). 다음 문제를 해결합니다. – Nasgar

+0

필자는 반복기를 만들고 함수를 모방하는 방법을 알고있다. 내 질문은 모든 테스트 기능에 대해 모의 작업을 다시 설정할 수있는 쉬운 방법이 있는지 여부였다. – aquavitae

1

당신은 대신 클래스에 적용하는, 모든 테스트에 패치를 적용해야합니다 :

class Tests: 
    @patch('time.clock', MagicMock(side_effects=[1, 2])) 
    def test_1(self): 
     assert time.clock() == 1 
     assert time.clock() == 2 

    @patch('time.clock', MagicMock(side_effects=[1, 2])) 
    def test_2(self): 
     assert time.clock() == 1 
     assert time.clock() == 2 
관련 문제