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

Немного надуманный пример, который показывает, о чем я говорю:

class PeopleCounter
  constructor(people) {
    this.people = people;
  }
  count() {
    return this.people.length;
  }
}

var peeps = People.find();
var people = new PeopleCounter(peeps);
people.count();
> 4

В приведенном выше примере тестирование не так просто, как запуск метода подсчета, я должен быть уверен, что загружаю данные через конструктор. Хотя этот пример прост, он усложняется, если конструктор подготавливает данные до того, как они попадут в массив.

Я знал об этом некоторое время, но я просто тестировал приложение и подумал, что поэкспериментирую с некоторыми идеями. Моя первая идея была:

class PeopleCounter
  constructor(people) {
    this.people = people;
  }
  doCount(people) {
    return people.length;
  }
  count() {
    return doCount(this.people);
  }
}
var peeps = People.find();
var people = new PeopleCounter();
people.doCount(peeps);
> 4

Мне не нравится идея создания второго метода для любого другого метода, использующего методы класса. На чем я остановился сейчас:

class PeopleCounter
  constructor(people) {
    this.people = people;
  }
  count(people) {
    var people = people || this.people;
    return people.length;
  }
}
var people = new PeopleCounter();
var peeps = People.find();
people.count(peeps);
> 4

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

Как вы решили эту проблему?