1

私は、Python の記述に関しては完全な初心者であり、テストは言うまでもありません。

私のFlaskエンドポイントは次のとおりです。

@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

これが私のテストです:

@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,
    )

私が受け取っているエラーは次のとおりです。

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

何が悪いのかわかりません。どんな助けでも大歓迎です!ありがとう!

4

1 に答える 1

4

sumall_redisビューモジュールにローカル名としてインポートしましたが、元のsumall.utils.sumall_redis.

おそらくビューモジュールの上部にこれがあります:

from sumall.utils import sumall_redis

これにより、そのオブジェクトがモジュール内のローカル名にバインドされます。テストが開始され、パッチが適用されると、このローカル名ではなく、モジュールsumall_redis内の元のオブジェクトのみsumall.utilsが影響を受けます。

代わりに、ビュー モジュールにバインドされた名前をモックする必要があります。

@mock.patch('view_module.sumall_redis')

これは、他の 2 つのインポートにも適用されます。

ドキュメントには、パッチを適用する場所に関するmockガイドが含まれており、読みたい場合があります。

于 2014-02-14T13:31:55.447 に答える