#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:
Вызовите свой общедоступный метод и понаблюдайте за поведением и состоянием вашей системы. Вызываются ли другие компоненты? Меняется ли какое-либо состояние? Это то, что вы проверяете. Если это происходит из-за того, что метод вызывает другие методы или делает это сам по себе, это не имеет значения.
Другой способ подумать об этом: представьте, что ваш частный метод не существует, но код является частью ваших общедоступных методов. Теперь вы тестируете эти общедоступные методы, и все в порядке. Затем вы замечаете, что последняя часть двух общедоступных методов одинакова, за исключением того, что делает что-то логическое, и вы извлекаете этот код в закрытый метод. Делает ли это ваши тесты недействительными?