У меня есть две функции, foo
и bar
.
function foo() {
if (arguments.length !== 1) {
throw new TypeError('only one argument expected');
}
do work;
}
function bar() {
if (arguments.length !== 3) {
throw new TypeError('exactly three arguments expected');
}
do work;
}
Эти функции были созданы в соответствии с TDD — например. Сначала были написаны тесты, затем реализованы функции, обеспечивающие их прохождение. Список тестов:
foo()
определеноfoo()
делает свою работу правильноfoo()
выдаетTypeError
при неправильном количестве аргументовbar()
определеноbar()
делает свою работу правильноbar()
выдаетTypeError
при неправильном количестве аргументов
Как видите, обе эти функции имеют дублирующий функционал — они проверяют правильность аргументов каждая сама по себе. Поскольку эта проверка будет очень распространена среди моих функций и может стать более сложной (проверка количества аргументов в каком-то диапазоне, проверка типов аргументов и т. д.), я решил переместить ее в отдельную функцию-декоратор check
.
Итак, я написал тесты для check
и реализовал саму check
.
Теперь шаг рефакторинга — я воспользовался преимуществом check
, поэтому теперь функции выглядят следующим образом:
foo = check(1, function() {
do work;
});
bar = check(3, function() {
do work;
});
Что мне теперь делать, чтобы тесты, проверяющие foo()
и bar()
, принимали правильное количество аргументов? Могу ли я бросить их?
Когда я реализую функцию buzz()
, которая немедленно использует check()
(поскольку теперь она используется как способ определения функций), нужно ли мне писать тест, чтобы она принимала правильное количество аргументов? Я сомневаюсь, потому что этот тест всегда будет зеленым, так как вся работа выполняется в декораторе, так что есть ли необходимость в тесте?