2014-02-14 2 views
1

필자는 파이썬 작성과 관련하여 완전히 새로운 기능을 제공합니다. 내가 잘못이 무엇인지 확실하지 않다Python : Flask로 모의 패치 오류가 발생했습니다.

AssertionError: Expected call: get_oauth_token('123456') 
Not called 

:

@mock.patch('sumall.utils.sumall_api') 
@mock.patch('sumall.utils.sumall_audience') 
@mock.patch('sumall.utils.sumall_redis') 
def test_mailing_finish(self, sumall_redis_mock, sumall_audience_mock, sumall_api_mock): 

    sumall_redis_mock.get_oauth_token.return_value = self.access_token 

    sumall_audience_mock.get_response_data.return_value = {'recipient_count': 2} 

    event = { 
     'timeStamp': self.data['timestamp'][3:], 
     'eventId': 'mailing_id:{mailing_id}'.format(mailing_id=self.data['mailing_id'],), 
     'data': { 
      'EMAIL_SENDS': { 
       'value': sumall_audience_mock.get_response_data.get('recipient_count'), 
       'dimensions': [ 
        { 
         'dimension': 'MAILINGS', 
         'value': self.data['mailing_id'], 
        }, 
       ], 
      }, 
     }, 
    } 

    res = self.client.post(
     '/webhooks/mailing_finish/{account_id}/{sumall_stream_id}'.format(
      account_id=self.account_id, 
      sumall_stream_id=self.sumall_stream_id 
     ), 
     data=json.dumps({'data': self.data}), 
     content_type='application/json', 
    ) 

    sumall_redis_mock.get_oauth_token.assert_called_with(self.account_id) 

    sumall_audience_mock.get_response_data.assert_called_with(
     access_token=self.access_token, 
     account_id=self.account_id, 
     mailing_id=self.data['mailing_id'] 
    ) 

    sumall_api_mock.post_stream_event.assert_called_with(
     stream_id=self.sumall_stream_id, 
     event=event, 
    ) 

내가 수신하고 오류는 다음과 같습니다

@blueprint.route('/mailing_finish/<account_id>/<sumall_stream_id>/', methods=['POST']) 
def mailing_finish(account_id, sumall_stream_id): 
    """ 
    Get Response for mailing_id and update Dataset: 
    * MYEMMA_EMAIL_SENDS: response['sent'] 
    """ 

    # TODO: webhook does not fire 

    data = json.loads(request.data)['data'] 

    access_token = sumall_redis.get_oauth_token(account_id) 

    response_data = sumall_audience.get_response_data(
     access_token=access_token, 
     account_id=account_id, 
     mailing_id=data['mailing_id'], 
    ) 

    event = { 
     'timeStamp': data['timestamp'][3:], 
     'eventId': 'mailing_id:{mailing_id}'.format(
      mailing_id=data['mailing_id'], 
     ), 
     'data': { 
      'MYEMMA_EMAIL_SENDS': { 
       'value': response_data['recipient_count'], 
       'dimensions': [ 
        { 
         'dimension': 'MAILINGS', 
         'value': data['mailing_id'], 
        }, 
       ], 
      }, 
     }, 
    } 

    status = sumall_api.post_stream_event(
     stream_id=sumall_stream_id, 
     event=event, 
    ) 

    return 'Data sent to SumAll', status 

내 테스트입니다 : 여기

내 플라스크 엔드 포인트입니다 . 어떤 도움이라도 대단히 감사하겠습니다! 감사!

답변

4

보기 모듈에서 sumall_redis을 로컬 이름으로 가져 왔지만 원래 sumall.utils.sumall_redis을 조롱했습니다.

당신은 아마 당신의보기 모듈의 상단이 있습니다

from sumall.utils import sumall_redis 

이 모듈의 로컬 이름에 해당 객체를 결합한다. 테스트가 시작되고 패치가 적용되면 sumall.utils 모듈의 원래 sumall_redis 개체 만 영향을받으며이 로컬 이름은 영향을받지 않습니다.

대신보기 모듈에서 바인딩 이름을 조롱해야합니다 :이뿐만 아니라 다른이 개 수입에 적용

@mock.patch('view_module.sumall_redis') 

.

mock 설명서에는 읽을 수있는 where to patch에 대한 안내서가 포함되어 있습니다.

+0

도움을 많이 주셔서 감사합니다. – dennismonsewicz