Как смоделировать ответ от интегрированного сервиса при тестировании сервера - PullRequest
0 голосов
/ 12 апреля 2020

Короче говоря, я работаю над созданием сервера, который служит чем-то вроде чат-бота. Сервер использует Google диалог потока. Прямо сейчас у меня выставлена ​​конечная точка, которая позволяет мне общаться с моим сервером, при достижении этой конечной точки вызывается Google Auth, а также поток диалога Google. Я пытаюсь смоделировать ответ диалогового потока, оставляя фактический сервер, чтобы ответить на сетевой вызов. На данный момент мой тест выглядит следующим образом.

Это мой базовый тестовый файл:

import unittest
import mock


class BaseTest(unittest.TestCase, object):
    def __init__(self, *args, **kwargs):
        super(BaseTest, self).__init__(*args, *kwargs)

    def auto_patch(self, patch_target):
        patcher = mock.patch(patch_target)
        patched = patcher.start()
        self.addCleanup(patcher.stop)
        return patched

Это мой тестовый файл:

import json
import uuid
from os import path
from tests.base_test import BaseTest
from agent.api_service import app
import requests_mock
import pytest
from hamcrest import assert_that, has_items, equal_to

CWD = path.dirname(path.realpath(__file__))


class TestAudio(BaseTest):
    def test__interact__full_no_stt(self):
        payload = json.load(open("tests/json_payloads/test__interact__full_audio.json"))
        u_session_id = str(uuid.uuid1())
        payload["session_id"] = u_session_id

        #mock a 500 back from STT
        with open("tests/json_payloads/stt_500.json", "r") as issues_file:
            mock_response = issues_file.read()

        with requests_mock.Mocker() as m:
            m.register_uri('POST', 'https://speech.googleapis.com/v1/speech:recognize', text=mock_response)



        request, response = app.test_client.post("/agent_service/interact", data=json.dumps(payload))
        self.assertEqual(200, response.status)

Это мой файл Google STT:

import json
import requests
from agent.exceptions import GoogleSTTException
from agent.integrations.google.google_auth_service import get_auth_token
from agent.integrations.google.google_stt_request import GoogleSTTRequest
from agent.integrations.google.google_stt_response import GoogleSTTResponse


def speech_to_text(audio_string):
    try:
        google_stt_request = GoogleSTTRequest(audio_string).to_payload()

        request_headers = dict()
        request_headers['Authorization'] = 'Bearer ' + get_auth_token()
        request_headers['Content-Type'] = 'application/json'

        url = 'https://speech.googleapis.com/v1/speech:recognize'
        google_response = requests.post(url, data=json.dumps(google_stt_request), headers=request_headers)
        response = GoogleSTTResponse(google_response.json())
        return response

    except Exception as e:
        raise GoogleSTTException('Received an error invoking google stt {}'.format(e))

У кого-нибудь есть идеи о том, как я могу высмеять ответ на вызов Google STT, не касаясь вызова Google Auth или самого вызова сервера? Я перепробовал несколько вещей и пока не повезло. Я либо ничего не высмеиваю, либо и Google Stt, и Auth Call.

1 Ответ

0 голосов
/ 12 апреля 2020

Так что я закончил тем, что отошел от первоначальной реализации, но это то, что привело меня туда.

    @responses.activate
    def test__interact__full_no_stt(self):
        payload = json.load(open("tests/json_payloads/test__interact__full_audio.json"))
        u_session_id = str(uuid.uuid1())
        payload["session_id"] = u_session_id

        #mock a 500 back from STT
        responses.add(responses.POST,
                      'https://speech.googleapis.com/v1/speech:recognize',
                      json={'error': 'broken'}, status=500)



        request, response = app.test_client.post("/agent_service/interact", data=json.dumps(payload))
        self.assertEqual(200, response.status)
        result = response.json

Ответы делают это намного проще, просто обязательно добавьте аннотацию вверху теста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...