Как проверить функцию, вызывающую несколько других функций? - PullRequest
1 голос
/ 27 июня 2019

Я пишу промежуточное программное обеспечение ExpressJS, которое немного модифицирует объект запроса и проверяет, есть ли у пользователя доступ к этой конкретной странице. У меня проблема с юнит-тестированием. Я написал отдельные тесты для каждого метода, кроме одного: handler. Как я могу проверить функцию handler? Должен ли я проверить это? Или я должен просто проигнорировать это с istanbul ignore next, поскольку у меня есть все остальные функции? Или, может быть, мне нужно как-то переписать мою handler функцию, чтобы она была тестируемой?

class Example {

constructor(request, response, next, userAccountService) {
    this.req = request;
    this.res = response;
    this.next = next;
    this.userAccountService = userAccountService;
}

removeTokenFromQuery() {
    delete this.req.query.token;
}

isValidRequest() {
    if (!this.req.secure) {
        return false;
    }

    if (typeof this.req.query.token !== 'undefined') {
        return false;
    }

    if (typeof this.req.query.unsupportedQueryParam !== 'undefined') {
        return false;
    }

    return true;
}

isPageAccessibleForUser() {
    return this.userAccountService.hasAccess('example');
}

async handler() {
    this.removeTokenFromQuery();

    if (!this.isValidRequest()) {
        throw new Error('Invalid request');
    }

    if (!this.isPageAccessibleForUser()) {
        this.res.statusCode(500);
        this.res.end();
        return;
    }

    this.next();
}

}

Тогда это называется промежуточным ПО Express:

this.app.use((res, req, next) => {
    const exampleObj = new Example(res, req, next, userAccServ);
    exampleObj.handler();
});

1 Ответ

1 голос
/ 27 июня 2019

Стоит ли мне это проверять?

Да, на основе вашего примера обработчик содержит (как выглядит) некоторую критическую бизнес-логику.Он отвечает за оркестровку :

  • удаление токена из запроса (безопасность)
  • определение того, является ли запрос действительным (безопасность / аутентификация)
  • определение доступности страницы для пользователя (безопасность / авторизация)

Если эта функция не была протестирована, будущий инженер может внести изменения в эту важную функцию, и они не будутполучать любые отзывы об их изменении.Предположим, что из-за человеческой ошибки они случайно удалили проверку isValidRequest?или удалил !.Однако маловероятно, что риск, связанный с этим, может быть катастрофическим по сравнению с относительно небольшим усилием, необходимым для проверки этого.

Как я могу проверить функцию обработчика?

Следующий вопрос - как вы на самом деле тестируете это :) Я бы предпочел протестировать это на самом низком «уровне», возможном ниже (юнит тестирует этот метод, вызывая его напрямую против выше (собираетсячерез экспресс-фреймворк).

Как вы упомянули, существуют тесты для реализаций каждой из функций, делегируемых handler, IMO важная вещь для проверки в handler - это поток, а НЕреализации (так как они уже хорошо протестированы).

describe('handler()', () => {
  it('removes token from query');
  it('errors on invalid request');
  it('returns 500 status code when page is inaccessible');
  it('continues with .next() when request is valid and page is accessible');
})

Чтобы сделать это, я бы создал Example и затем исправил методы, необходимые для создания правильного потока для ваших handler() тестов.Таким образом, для теста недопустимого запроса это может выглядеть следующим образом:

const example = new Example();
sinon.stub(example, "isValidRequest").returns(false);

Если это не задано, чем эти тесты, по сути, дублируют tон другие тесты (путем тестирования фактической реализации).Использование заглушек позволяет реализовать реализацию isValidRequest, в то же время имея защиту модульного теста в handler

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