История до сих пор…

Итак, в части первой мы преобразовали модуль Ancient Fake в класс. Мы обновили тесты и все по-прежнему работало как положено 😎. Итак, что нам делать дальше?

Почему мы вообще снова начали рефакторинг?

Как я упоминал в первой части, иногда некоторые тесты мошеннических модулей давали сбой. Это может быть связано с тем, что некоторые из утверждений не будут выполнены из-за случайного значения, которое будет возникать очень редко. В текущих тестах я повторяю метод модуля 100 раз в большинстве случаев, чтобы убедиться, что все возвращает ожидаемые результаты, но, очевидно, этого было недостаточно 😩!

Что исправить?

Я думал о подходе к утверждениям по-другому. Все, что я хотел проверить, это то, что мы вернули предмет из коллекции. Так почему бы просто не заглушить вызов, если я знаю, что конкретный метод вернет случайное значение. Для этого мне потребуется создать новый модуль фейкера, Faker.Random.

Реализация

У меня уже было несколько методов для получения элемента из коллекции, поэтому я мог повторно использовать их, чтобы ускорить создание этого нового модуля.

И теперь мы можем добавить это к нашему основному объекту Faker.

Я также добавил несколько тестов для этого нового мошеннического модуля, так как он находится в общедоступном API!

Теперь это не так, мы можем использовать его для внедрения предсказуемой случайности в наш тест модуля Ancient Fake 😎

Делаем себе инъекции…

Чтобы использовать наш новый модуль Random faker, нам нужен способ внедрить его в наш класс Ancient. Итак, сначала нам нужно начать с рефакторинга основного объекта Faker, который содержит все мошеннические модули. Таким образом, мы можем внедрить его в каждый модуль, который он включает… Возможно, это не очень хорошо объясняется… так что позвольте мне показать вам!

Итак, сначала нам нужно преобразовать объект Faker в класс.

Мы запускаем тесты… все по-прежнему золото! ✅

Далее нам нужно обновить конструктор модуля Ancient faker.

И если мы проведем тесты… они все равно пройдут! 🙌

Затем мы можем обновить свойство Ancient в классе Faker, включив в него себя.

Теперь мы можем использовать другие модули фейкеров в нашем собственном модуле 😎. Итак, давайте внесем несколько изменений…

Вы видите, что теперь мы используем модуль Random faker для извлечения элемента из коллекции. И мы знаем, что метод element работает, потому что мы написали для него тесты.

Что дальше?

В третьей части я объясню, как использовать этот новый код при написании тестов, чтобы исключить случайные сбои. Это потребует использования пакетов npm sinon и sinon-test.