Думаю, это будет простая заметка и объяснение, без придирчивых преобразований, но та самая мысль о том, что TDD научил меня мыслить по-другому — правда. Но в итоге, это привело к тому, что я отказался от него.

Давным давно, в 2009 году, прослышав о TDD я решил внедрить его в команду, будучи даже не тимлидом. Надо мной посмеялись и сказали: ну, давай, попробуй.
И я честно пытался. Итого над своим кодом я порой думал несколько часов и писал почти идеальный код (ну, вы же понимаете). В итоге, все придирки от ревьюверов было «ну, тут можно же вот так и вроде норм».
И это был чэллендж, брошенный самому себе. И я его выполнил в течение месяца. И научился писать код, который легко покрывал все мои тесты TDD.



Как я пишу функцию. Начнем с сложения двух чисел:

function calc(a,b){
	return a+b;
}


Хм, но ведь всякое бывает.

function isNumber(n){
	return Number(n);
}
function calc(a,b){
	return isNumber(a)+isNumber(b);
}


Да, но это же не все…

function isNumber(number){
	const n = parseInt(number, 10);
	const result = !isNaN(n) && isFinite(n);
	return result && n;
}
function calc(a,b){
	const newA = isNumber(a);
	const newB = isNumber(b);

	if (typeof(newA)==="number" && typeof(newB)==="number"){
		return a+b;
	}
	return null;
}


Но блин, это ведт тоже не все…

function isNumber(number){
	n = parseInt(number, 10);
	const result = n.toString()===number.toString() && !isNaN(n) && isFinite(n);
	return result && n;
}

function calc(a,b){
	const newA = isNumber(a);
	const newB = isNumber(b);

	if (typeof(newA)==="number" && typeof(newB)==="number"){
		return a+b;
	}
	return null;
}


Вот, теперь кажется все.

К чему я это? А, да. Не доверяй входящим переменным.
И не доверяй возвращаемым переменным. Не до фанатизма, но все-таки.
Тесты могут поменять. И при этом проверять будешь не ты, а кто-то другой, который даже не увидит ошибку: не во всех проектах выделяют 2 часа на ревью.
Со временем я перестал писать тесты от слова совсем, но я всегда и исключительно всегда спрашивал: ты уверен что там придет число? Или не null? А вдруг это будет что-то иное? А если функция вернет тебе ошибку или еще какую-нибудь дичь?
Да, не любили, да, боролись, а потом приняли в паре ошибок и понеслось.

Не верьте входящим переменным, не верьте результату и код будет сложноватым, но безопасным.