Как протестировать частную или анонимную функцию?

Представьте, что у меня есть следующие модули:

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
Другие вопросы по тегам