2

我正在使用 JavaScript 间谍库 simple-spy

我发现当监视给定函数时,生成的间谍总是有一个 0。

这给我使用 这个柯里化函数带来了问题。

所以我提交了一个拉取请求,为 spy library 添加了 arity 透明度

代码如下所示:

function spy(fn) {
    const inner = (...args) => {
        stub.callCount++;
        stub.args.push(args);
        return fn(...args);
    };

    // ends up a string like
    // 'a,b,c,d'
    // depending on the `fn.length`
    const stubArgs = Array(fn.length)
        .fill(null)
        .map((m, i) => String.fromCodePoint(97 + i))
        .join();

    const stubBody = 'return inner(...arguments);';

    // this seems to be the only way
    // to create a function with
    // programmatically specified arity
    const stub = eval(
        // the wrapping parens is to
        // prevent it from evaluating as
        // a function declaration
        `(function (${stubArgs}) { ${stubBody} })`
    );

    stub.reset = () => {
        stub.callCount = 0;
        stub.args = [];
    };

    stub.reset();

    return stub;
}

exports.spy = spy;

这似乎有效。

是否可以在不使用的情况下做到这一点eval

是否有可能将使用减少eval 到更少?

我知道这个间谍实现还有其他问题。它很简单,到目前为止它适用于我的用例。

4

1 回答 1

2

就像本杰明写的那样,我用了一个简单的:

function spy(fn) {
    const stub = (...args) => {
        stub.callCount++;
        stub.args.push(args);
        return fn(...args);
    };

    stub.reset = () => {
        stub.callCount = 0;
        stub.args = [];
    };

    stub.reset();

    Object.defineProperty(stub, 'length', {value: fn.length});

    return stub;
}

exports.spy = spy;

好多了,好看多了。

于 2016-10-28T22:20:37.557 回答