2013-08-06 1 views
5

모의를 사용하여 클래스의 메소드를 특정 반환 값으로 대체하려고합니다. 그것은 매우 잘 어쩌면 조금은 잘 될 것입니다. 나는 이것을 수행합니다 (아래 참조).하지만 다음 테스트 클래스에서는 조롱하지 않고 패스워드 클래스를 재사용합니다.이 테스트에 배치 된 모의 객체는 여전히 효과적입니다. 파이썬 실행 취소 메소드 가짜

from utils import password as pass_helper 

class TestPassword(unittest.TestCase): 
    def setUp(self): 
     self.username = "user" 
     self.password = "Test_1234_pass" 
     pass_helper._get_password_from_keyboard = Mock(return_value=self.password) 

    def test_password(self): 
     password = pass_helper._get_password_from_keyboard(self.username) 
     self.assertEqual(password, self.password) 

나는 이런 식으로 뭔가를 수행하여 분해 방식의 모의을 취소하려했지만 작동하지 않습니다.

pass_helper._get_password_from_keyboard = pass_helper._get_password_from_keyboard 

어떻게 클래스 메서드의 원래 functionnality를 복원 할 수 있습니까?

답변

3

당신이 모아 봤 듯이 문제는 테스트의 범위에만 국한되지 않고 대신 다른 테스트로 흘러 들어가는 것입니다 (물론 단위 테스트를 할 때 큰 문제입니다) .

이 같은
pass_helper._get_password_from_keyboard = pass_helper._get_password_from_keyboard 

뭔가해야 : 당신의 분해 방법의 변화를 반전에 대한 당신의 생각은하지만 문제는 그 자체로 다시 방법의 모의 버전을 다시 할당되는이 작업을 수행 할 때입니다, 좋은 하나입니다 메소드를 조롱하기 전에 메소드의 '실제'버전을 임시 변수에 할당하십시오.

def setUp(self): 
    self.username = "user" 
    self.password = "Test_1234_pass" 
    self.real_get_password_from_keyboard = pass_helper._get_password_from_keyboard 
    pass_helper._get_password_from_keyboard = Mock(return_value=self.password) 

def tearDown(self): 
    pass_helper._get_password_from_keyboard = self.real_get_password_from_keyboard 

def test_password(self): 
    password = pass_helper._get_password_from_keyboard(self.username) 
    self.assertEqual(password, self.password) 

희망이 있습니다.

+0

내 문제를 고쳤습니다. 감사합니다. :) – Amaranth

+0

이 작업을 수행 한 후 언 바운드 메소드 xxx가 xxx 인스턴스를 첫 번째 인수로 호출해야합니다 (int가 대신 있음). –