В случае если объект внутри себя инстанциирует другой объект, тогда такой объект должен рассматриваться как единый юнит.
import LineItem from './LineItem';
class Order {
constructor(lineItems = []) {
this.lineItems = lineItems;
}
addLineItem(name, cost, quantity) {
this.lineItems.push(new LineItem(name, cost, quantity));
}
}
В этом случае писать юнит-тест необходимо на класс Order. Необходимости в тестировании класса LineItem нет, так как он является составной частью класса Order. Такие классы носят название - Агрегат. Когда автосалон вас приглашает на тест-драйв автомобиля, то это предполагает тестирование Агрегата в целом, то есть Автомобиля. Тестировать отдельно составные его части такие как колеса/двигатель мы не будем.
В случае если объект принимает другой объект из вне, тогда такие объекты должны рассматриваться как отдельные юниты.
class Route {...}
class Ship {
addRoute(route) {
if (!(route instanceof Route)) {
throw new Error('route must be instance of Route');
}
this.route = route;
}
...
}
В этом случае необходимо писать отдельные юнит-тесты на Route и на Ship. Чтобы написать юнит-тест на класс Ship его необходимо изолировать от класса Route с помощью мок-объекта.
Интеграционный тест подразумевает, что вы не будете подменять Route на мок-объект, чтобы протестировать класс Ship. Вместо это необходимо передать настоящую реализацию класса Route. В таком случае мы протестируем взаимодействие между двумя юнитами Ship и Route.