copal
@copal
𝄞 ...оооо baby

Как правильно писать тесты в javascript для классов и их методов?

Есть непонимание процесса написания правильных тестов. Для примера возьмем два простых класса -
class List {
    constructor(){
        this.itemAll = [];
    }

    insertItem(item){
        this.itemAll.push(item);
    }
    hasItem(item){
        return this.itemAll.indesOf(item) > -1;
    }
}

class Factory {
    constructor(){
        this.list = new List();
    }
    insertProduct(product){
        if( ! this.list.hasItem(product)){
            this.list.inserItem(product);
        }
    }
}

И вот я значит написал тест для LIst, где при добавлении мониторил длину массива, чтобы удостоверится что элемент туда добавился и так далее. Но пришло время написать тест для Factory и у меня мысли разбежались в разные стороны. То есть вот в чем дело. Добавил я продукт и что мне мониторить? Хорошо если у List будет длина, а если этот класс, который не предоставляет данные о внутренних объектах? А нужно ли мне писать тесты и для вызовов объектов находящихся в композиции? то есть вот я вызвал insertProduct, а дальше должен узнать, а был ли вызван hasItem и что в него передано и что возвращено?
Но если это так, то мне придется увеличивать сложность тестов и писать одно и тоже в геометрической прогрессии. Или же не нужно проверять внутреннею работу других объектов?

Расскажите как правильно, а то очень сложно самому догадаться.
  • Вопрос задан
  • 601 просмотр
Пригласить эксперта
Ответы на вопрос 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Есть непонимание процесса написания правильных тестов.


Процесс просто. Формализуем тест кейс, описываем его в виде теста. Причем нужно делать так, что бы тесты ничего не знал о реализации нашего объекта, завязка исключительно на интерфейс. Тогда оверхэда на написание и поддерживание тестов практически не будет.

Добавил я продукт и что мне мониторить?


У вашего объекта должен быть какой-то публичый метод, который может предоставить проверку.

Если такого метода нет, то нам надо подменить List на мок, но ваш код этого не позволяет сделать. Опять же это мы уже тест на реализацию завязываем, а стало быть наши тесты становятся хуже. Но коль уж мы пошли по этому пути можно просто length померять.
Ответ написан
Ваш ответ на вопрос

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

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