如何使用 SinonJS 将间谍放到单个函数中?

How to put a spy to a single function using SinonJS?

我有这个:

import * as sinon from 'sinon';
import {someFunc, someOtherFunc} from 'someModule';

describe("Something", () => {

  let sandbox: sinon.SinonSandbox;

  beforeEach('setup sandbox', function() {
    sandbox = sinon.createSandbox();
  });

  afterEach('restore sandbox', function() {
    sandbox.restore();
  });

  it("SomeTest", async () => {

    const spy = sanbox.spy(someFunc);
    someOtherFunc(1);
    console.log(spy.callCount) // prints 0
    
  })

someFunc() 只是一个简单的函数,它被导出为:

export function someFunc(...)

它是由 someOtherFunc() 调用的。然而,间谍永远不会被召唤。调用次数为0.

这样用诗乃不行吗?这适用于 Jest。

我认为它不起作用,因为 sinon 没有用间谍替换函数。

我也试过对模块本身进行监视:

import * as lib from 'someModule'
...


 it("SomeTest", async () => {

    const spy = sanbox.spy(lib);
    lib.someOtherFunc(1);
    console.log(spy.someFunc.callCount) // prints 0

  })

但这会产生相同的结果。 0 个调用。

我认为你可以编写对象方法的间谍程序。您可能可以导入整个对象并使用对象为该函数编写一个间谍。

import * as sinon from 'sinon';
import someModule from 'someModule';

describe("Something", () => {

      let sandbox: sinon.SinonSandbox;

      beforeEach('setup sandbox', function() {
        sandbox = sinon.createSandbox();
      });

      afterEach('restore sandbox', function() {
        sandbox.restore();
      });

      it("SomeTest", async() => {

        const spy = sanbox.spy(someModule, 'someFunc');
        someModule.someOtherFunc(1);
        console.log(spy.callCount) // prints 0

      })

澄清一下:

为了能够使用 Sinon 间谍,您需要以某种方式导出您的模块功能。基本上,使用 类 或对象。

作品:

export default {
func() {},
func2() {}
}

export const someLib {
func() {},
func2() {}
}

module.exports = {
func() {}
}

class Ping {
func() {}
}

export default Ping();

或类似的东西。

什么不起作用:

export function func() {}
export function func2  {}

export const foo = () => {}

等等..