Насмешка над методом, который вызывается с использованием функции стрелки в качестве параметра

Как я могу использовать пакет 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% охват, каждая переменная и замыкание должны подвергаться воздействию внешнего мира.

Другие вопросы по тегам