Как модульно протестировать общедоступный метод, вызывающий закрытый метод

#javascript #unit-testing

#javascript #модульное тестирование

Вопрос:

Вот очень простой пример, иллюстрирующий мою точку зрения

 class SomeClass {

    publicMethod1(param1, param2) {

        if (param1 === "some value") {
            // do stuff
        } else {
            // do stuff
        }

        this.privateMethod(true);

    }

    publicMethod2(param1, param2, param3, param4) {

        if (param3) {
            // do stuff
        } else {
            // do stuff
        }

        this.privateMethod(false);

    }

    privateMethod(param) {

        // do stuff

        let obj = database.getObject(param); // call to database

        if (obj.property === "random") {
            // do stuff
        } else {
            // do stuff
        }

    }
}
 

Я провел небольшое исследование по этой теме, но не нашел людей, задающих точный вопрос, который я задаю. Я думаю, мне ясно, что я должен тестировать только свои общедоступные методы, а не частные. Но мне просто интересно, как я должен тестировать свои общедоступные методы, которые вызывают частные методы, которые находятся в том же классе.

Должен ли я просто тестировать, чтобы убедиться, что был вызван частный метод? Или я должен углубляться в логику частного метода, чтобы убедиться, что я тестирую все возможные пути выполнения? И если это «да» для последнего, мне было интересно, принято ли повторно использовать модульные тесты при работе с частными методами, которые вызываются несколько раз (как в примере выше).

Комментарии:

1. Во-первых, у вас нет никаких частных методов в этом классе. Но, если бы вы это сделали (перед именем метода ставьте # ), ваши модульные тесты должны были бы подчеркивать каждый общедоступный метод вызовами частного метода. Покрытие кода гарантирует, что вы охватили все ветви / строки / и т.д.

2. @RandyCasburn Извините, я могу быть немного смущен вашим ответом. Вы хотите сказать, что я должен выбрать первый вариант, который я изложил, или второй? Должен ли я просто тестировать, чтобы убедиться, что был вызван частный метод? Или я должен углубляться в логику частного метода, чтобы убедиться, что я тестирую все возможные пути выполнения?

3. Вы должны сделать и то, и другое. Убедитесь, что был вызван частный метод, и убедитесь, что вся логика частного метода была реализована вашими тестами. Для этого у вас есть два варианта: 1. запустите тесты с помощью отладчика и выполните пошаговое выполнение частного метода (это непрактично) 2. используйте инструмент покрытия кода, который покажет вам, какие части вашего частного метода были выполнены.

4. Просто чтобы прояснить мой смысл, ознакомьтесь с этим repl для объяснения: repl.it/@randycasburn/Jester#README.md

Ответ №1:

Вызовите свой общедоступный метод и понаблюдайте за поведением и состоянием вашей системы. Вызываются ли другие компоненты? Меняется ли какое-либо состояние? Это то, что вы проверяете. Если это происходит из-за того, что метод вызывает другие методы или делает это сам по себе, это не имеет значения.

Другой способ подумать об этом: представьте, что ваш частный метод не существует, но код является частью ваших общедоступных методов. Теперь вы тестируете эти общедоступные методы, и все в порядке. Затем вы замечаете, что последняя часть двух общедоступных методов одинакова, за исключением того, что делает что-то логическое, и вы извлекаете этот код в закрытый метод. Делает ли это ваши тесты недействительными?