Как протестировать частную или анонимную функцию?
Представьте, что у меня есть следующие модули:
foo.js
module.exports = function (x, f) {
f(x);
};
bar.js
const foo = require('./foo');
module.exports = function () {
foo(40, n => n + 2);
// ^
// f — How can I test this lambda?
};
Мне нужно только утверждать, что когда
bar
называется, называется точно так, как показано выше ^
я могу это проверить
foo
был вызван с
40
следующим образом:
const td = require('testdouble');
const foo = td.replace('./foo');
const bar = require('./bar');
bar();
td.verify(foo(40, td.matchers.anything())); // Pass
Но как я могу проверить, что функция
f
это функция, которая принимает число, добавляет к нему 2 и возвращает результат?
PS: я прекрасно понимаю, что это не совсем тестирование лучших практик 101. Я бы предпочел не тестировать таким образом, если бы у меня была возможность делать что-то по-другому. Так что, пожалуйста, пошутите со мной.
1 ответ
Я нашел два способа:
td.matchers.argЭто
Этот сопоставитель принимает предикат, который принимает значение своего позиционного параметра:
const td = require('testdouble');
const foo = td.replace('./foo');
const bar = require('./bar');
bar();
td.verify(foo(40, td.matchers.argThat(f => f(40) === 42))); // Pass
td.matchers.captor
Существует специальный сопоставитель, называемый захватчиком , который фиксирует свой позиционный параметр и делает его доступным позже через
.value
свойство сопоставителя:
const tap = require('tap');
const td = require('testdouble');
const foo = td.replace('./foo');
const bar = require('./bar');
const f = td.matchers.captor();
bar();
td.verify(foo(40, f.capture()));
tap.equal(f.value(40), 42); // Pass
tap.equal(f.value(50), 52); // Pass
tap.equal(f.value(60), 62); // Pass