Насмешка над методом, который вызывается с использованием функции стрелки в качестве параметра
Как я могу использовать пакет Sinon, чтобы заглушить / смоделировать вызов метода, когда один из параметров, которые я должен смоделировать, вызывается с помощью функции стрелки? например
let objWithMethod = { method : function(x) {}; };
function SUT() {
// use case
let x = 'some value';
let y = { anotherMethod : function(func) {}; };
// I want to test that `y.anotherMethod()` is called with
// `(x) => objWithMethod.method(x)` as the argument
y.anotherMethod((x) => objWithMethod.method(x));
}
let mockObj = sinon.mock(objWithMethod);
// Both of these fail with a "never called" error
mockObj.expects('method').once().withArgs(objWithMethod.method.bind(this, x));
mockObj.expects('method').once().withArgs((x) => objWithMethod.method(x));
SUT();
mockObj.verify();
Я не смог ничего найти ни в документации по sinon, ни после нескольких попыток поиска в Google.
1 ответ
Свободные совпадения, которые вы пытаетесь сделать, можно выполнить с помощью сопоставителей, чтобы сравнить с любой функцией, которая должна быть
mockObj.expects('method').withArgs(sinon.match.func)
И это не удастся, потому что objWithMethod.method
не называется вообще.
это
// Я хочу проверить это
y.anotherMethod()
называется с//
(x) => objWithMethod.method(x)
в качестве аргумента
не может быть сделано, потому что код не был написан с учетом тестов. JS не может отражать локальные переменные, и SUT
Функция - это черный ящик.
Чтобы быть доступными для тестов и получить 100% охват, каждая переменная и замыкание должны подвергаться воздействию внешнего мира.