Цель этого задания -- разработать инструмент, облегчающий процесс тестирования.
Для этого нужно реализовать модуль check.js
, который при инициализации расширяет прототипы базовых классов, добавляя в них вспомогательные методы.
Расширение прототипа следует использовать с осторожностью, так как оно может усложнить понимание кода. В целом этот метод считается плохой практикой, но может быть эффективно применён при решении ряда задач. Например, при тестировании кода.
var check = require('check.js');
check.init(); // в этот момент происходит расширение
// прототипов базовых классов
var me = {
name: 'Roman',
age: 26
};
me.checkContainsKeys(['age', 'name']); // true
me.checkHasValueType(['age', String]) // false
Примеры для основного и дополнительных заданий находятся в папке examples
, а заготовка самого модуля -- в папке src
. Как обычно, тесты можно найти в папке test
.
Для выполнения основной части задания необходимо реализовать перечисленные ниже методы. Метод должен быть доступен только для целей указанного типа.
checkContainsKeys(keys)
Определён для объектов и массивов. Проверяет, что цель содержит указанные ключи.checkHasKeys(keys)
Определён для объектов и массивов. Проверяет, что цель содержит только указанные ключи.checkContainsValues(values)
Определён для объектов и массивов. Проверяет, что цель содержит указанные значения.checkHasValues(values)
Определён для объектов и массивов. Проверяет, что цель содержит только указанные значения.checkHasValueType(key, type)
Определён для объектов и массивов. Проверяет, что значение по указанному ключу относится к указанному типу. Поддерживаемые типы:String
,Number
,Function
,Array
.checkHasLength(length)
Определён для массивов и строк. Проверяет, что длина цели соответствует указанной.checkHasParamsCount(count)
Определён для функций. Проверяет, что количество аргументов функции соответствует указанному.checkHasWordsCount(count)
Определён для строк. Проверяет, что количество слов в строке соответствует указанному. Словом считается последовательность символов, ограниченная с обеих сторон пробелами или началом/концом строки.
- код должен проходить валидацию
jscs
- код должен проходить тесты
При расширении прототипа базового класса всегда есть риск перезаписать уже имеющиеся свойства. Чтобы минимизировать вероятность этого нежелательного события, можно расширить базовый класс только одним свойством, называемым namespace -- пространством имён. Все вспомогательные методы кладутся в это свойство и не засоряют базовый класс.
Предлагается реализовать такое пространство имён и добавить в него все методы из основного задания.
var check = require('check.js');
check.init();
var me = {
name: 'Roman',
age: 26
};
me.check.containsKeys(['age', 'name']); // true
me.check.hasValueType(['age', String]) // false
Как известно, у null
нет прототипа, поэтому добавить для него вспомогательные методы обычным образом не получится.
Предлагается добавить метод-обёртку wrap
, позволяющий работать с null
.
var check = require('check.js');
var wrappedNull = check.wrap(null);
wrappedNull.isNull(); // true
var wrappedString = check.wrap("hello");
wrappedString.check.hasLength(5); // обёртка должна поддерживать стандартные методы
Предлагается реализовать свойство .not
, отрицающее любой из стандартных методов:
var check = require('check.js');
check.init();
var me = {
name: 'Roman',
age: 26
};
me.check.not.containsKeys(['age', 'name']); // false
me.check.not.hasValueType(['age', String]) // true