@Fly3110
web developer

Как тестировать модуль, который получает данные от внешних сервисов?

Всем привет.

Есть определенная функция, которая запрашивает "задание" с внешнего ресурса. И запрос и разбор ответа идет внутри функции.
Как можно/нужно написать тест для проверки работы в случае получения/не получения определенных данных?

Спасибо заранее.
  • Вопрос задан
  • 254 просмотра
Решения вопроса 1
k12th
@k12th
console.log(`You're pulling my leg, right?`);
Вынести разбор ответа в отдельную функцию/метод/модуль, чтобы можно было тестировать ее независимо.

Что же до запроса, то проще всего покрыть это e2e тестами. Ну или явно передавать в вашу функцию ту вещь, которая в вашем языке/платфоре делает запросы (например, в клиентском JS это XMLHTTPRequest или fetch), а в тестах ее подменять.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
TheKnight
@TheKnight
Программист
Как обычно - придумать тестовые данные, после чего работать с ними. Зависимости, которые не имеют отношения к тестируемой логике напрямую можно замокать (в Java я использую Mockito, для вашего случая думаю тоже есть что то, упрощающее жизнь). В приведенном ниже примере возможно найдется что то полезное для вас.
import org.junit.Assert;

class Test {

    public static void main(String[] args) {

        String message = "Hello, World!\nCheck this message.";

        ExternalController external = job -> {
            System.out.println(job);
            return job.toUpperCase();
        };

        InternalController tested = new InternalController(external);
        String results = tested.processRequest(message);
        Assert.assertEquals("HELLO, WORLD!\nCHECK THIS MESSAGE.\n", results);
    }
}

class InternalController {
    private ExternalController external;

    InternalController(ExternalController external) {
        this.external = external;
    }

    String processRequest(String message) {
        String[] jobs = message.split("\n");
        StringBuilder results = new StringBuilder();
        for (String job : jobs) {
            String result = external.doWork(job);
            results.append(result).append("\n");
        }
        return results.toString();
    }
}

interface ExternalController {
    String doWork(String job);
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы