2017-11-21 10 views
0

클래스 기반 함수 용 테스트 케이스 작성 시도. 이것은 내가 그냥 query_fun을 조롱하고 나머지를 할 수있는 테스트 케이스를 만들 필요가 내 수업클래스 내부의 메소드를 조롱하는 방법

class Library(object): 
    def get_file(self): 
     pass 

    def query_fun(self): 
     pass 

    def get_response(self): 
     self.get_file() 

     response = self.query_fun() 

     # some business logic here 
     return response 

의 골격이다. 아래 시도했지만 올바른 방향없는 것 같다 내가 기대하고있어 무엇

from unittest import mock, TestCase 
from library.library import Library 

class TestLibrary(TestCase): 
    def setUp(self): 
     self.library = Library() 

    @mock.patch('library.library.Library') 
    def test_get_response(self, MockLibrary): 
     mock_response = { 
      'text': 'Hi', 
      'entities': 'value', 
     } 
     MockLibrary.query_fun.return_value = mock_response 
     response = MockLibrary.get_response() 
     self.assertEqual(response, mock_response) 

이 설정 모의를하고 get_response를 호출하면 실제로 원래 query_fun 메소드를 호출, 대신 모의 query_fun를 호출하지 않습니다.

답변

0

당신은 전체 클래스을 조롱 한 계정을 고려해야합니다. 당신도 각각의 방법을 조롱 할 수

Library.query_fun를 교체 한
@mock.patch('library.library.Library.query_fun') 
def test_get_response(self, mock_query_fun): 
    mock_query_fun.return_value = { 
     'text': 'Hi', 
     'entities': 'value' 
     } 
    } 
    response = MockBotter.get_response() 
    self.assertIsNotNone(response) 

클래스의 다른 모든 장소에 아직도있다.

간체 데모 : 내가 원하는

>>> from unittest import mock 
>>> class Library(object): 
...  def query_fun(self): 
...   pass 
...  def get_response(self): 
...   return self.query_fun() 
... 
>>> with mock.patch('__main__.Library.query_fun') as mock_query_fun: 
...  mock_query_fun.return_value = {'foo': 'bar'} 
...  print(Library().get_response()) 
... 
{'foo': 'bar'} 
+0

모의 단지 기능 만. 나는이 대답이 내가 찾고있는 것이라고 생각한다. 그러나 또 다른'test_function'을 쓰면'TestLibrary'는 실제로'query_fun' 모의 메소드를 호출하지 않고 그냥 보통 메소드를 호출합니다. –

+1

@RobC : 각 테스트에는'@ mock.patch()'데코레이터가 필요합니다. 한 시험에서 나오는 모의는 다른 시험으로 이어지지 않습니다. –

+0

흠 ... 나는 그것도 생각했다. 하나의 마지막 질문'self.botter.query_fun'을 mock query_fun'으로 대체 할 수있는 방법이 있습니까? –