2013-04-17 1 views
0

클래스를 패치하려고합니다. 테스트중인 함수에 패치 된 클래스의 인스턴스를 만들고, 해당 인스턴스에서 클래스 함수를 호출 한 다음 해당 클래스 함수가 ​​호출되었는지 테스트하려고합니다. 어떻게해야합니까?패치 - 패치 된 클래스의 인스턴스가 클래스 함수를 호출했는지 확인하는 방법은 무엇입니까?

테스트 파일 :

class TestChannel(unittest.TestCase): 
    @patch("notification.models.Channel") 
    def testAddChannelWithNamePutsChannel(self, *args): 
     addChannelWithName("channel1") 
     self.assertTrue(Channel.put.called) 

코드를 테스트 할 :

def addChannelWithName(name): 
    channel = Channel(name = name) 
    channel.put() 

는 기본적으로, 그 채널을 테스트 할

다음은 내 코드의 기본 변형입니다. put()이 호출되었습니다. 물론이 코드는 클래스 함수 put()이 인스턴스가 아니라 일반적으로 호출되는지 검사하기 때문에 작동하지 않습니다. 그것을 통과시키기 위해 인스턴스에서 호출해야합니다. Channel 클래스의 다른 부분을 조롱하는 몇 가지 변형을 시도했지만 반환 값이지만 작동하도록 설정할 수는 없습니다. 어떻게해야합니까? 많이 고마워!

답변

1

addChannelWithName 함수를 만들면 Channel 인스턴스가 반환됩니다.

def addChannelWithName(name): 
    channel = Channel(name = name) 
    channel.put() 
    return channel 

class TestChannel(unittest.TestCase): 
    @patch("notification.models.Channel") 
    def testAddChannelWithNamePutsChannel(self, *args): 
     channel = addChannelWithName("channel1") 
     self.assertTrue(channel.put.called) 
+0

이 경우 작동하며 그 점을 +1 해 드리겠습니다. 그러나, 나는 또한 채널을 삭제하는 매우 유사한 기능을 가지고 있으며,이 경우 삭제 된 객체를 반환하려고 시도하는 것은별로 의미가 없습니다. 모든 경우에 적용될 수있는 아이디어가 있습니까? – golmschenk

+0

'채널'클래스에 대해 더 많이 알고, "채널 삭제"가이 질문에 대답하는 것을 (implie, do, 무엇이든) 무엇을 의미하는지 알아야합니다. 하나의 요점은 단위 테스트를 테스트 할 수있는 코드가 필요하다는 것입니다. 코드를 작성할 때 먼저 테스트 할 수있는 코드를 작성하는 것이 더 쉽습니다. –