3

如何使用 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 文档中找不到任何东西,也没有在谷歌搜索几次尝试后找到任何东西。

4

1 回答 1

0

您尝试进行的松散匹配可以使用matchers完成,以与它应该是的任何功能进行比较

mockObj.expects('method').withArgs(sinon.match.func)

它会失败,因为objWithMethod.method根本没有被调用。

这个

// 我想测试y.anotherMethod()被调用的

//(x) => objWithMethod.method(x)作为参数

无法完成,因为编写代码时没有考虑到测试。JS不能反映局部变量,SUT函数是一个黑盒。

为了便于测试并获得 100% 的覆盖率,每个变量和闭包都应该暴露给外部世界。

于 2016-07-15T04:26:33.890 回答