Sinon 存根替换了整个测试文件的 class 属性 而不是描述块

Sinon stub replaces class property for whole test file instead of describe block

我正在尝试替换 class 的静态方法,以便它 returns 用于测试目的的自定义值。

我的文件中有多个测试(描述)块,我的目标是仅替换其中一个描述块中的静态方法。

问题是所有测试的方法都被替换了,即使我有一个用原始方法替换静态方法的拆解方法。

一些代码:

class Cat {
    static sound() {
        return "Meow";
    }
}

module.exports = {
    Cat
}
const sinon = require("sinon");

const { Cat } = require("./myClass");

describe("Main tests", () => {
    describe("Test Cat", () => {
        it("Meows", () => {
            expect(Cat.sound()).toBe("Meow")
        })
    })

    describe("Test Dog", () => {
        const stub = sinon
            .stub(Cat, "sound")
            .callsFake(() => "Woof");

        afterAll(() => {
            stub.restore();
        });

        it("Barks", () => {
            expect(Cat.sound()).toBe("Woof")
        })
    })
})

测试结果 - 未替换的测试用例失败:

 FAIL  ./index.test.js
  Main tests
    Test Cat
      ✕ Meows (6ms)
    Test Dog
      ✓ Barks

  ● Main tests › Test Cat › Meows

    expect(received).toBe(expected) // Object.is equality

    Expected: "Meow"
    Received: "Woof"

       7 |     describe("Test Cat", () => {
       8 |         it("Meows", () => {
    >  9 |             expect(Cat.sound()).toBe("Meow")
         |                                 ^
      10 |         })
      11 |     })
      12 | 

有什么办法可以防止这种情况发生吗? 我尝试使用 createSandbox:

const sandbox = sinon.createSandbox()
        const stub = sandbox
            .stub(Cat, "sound") // etc

但这是一回事。

如有任何帮助,我们将不胜感激。

仅使用 jestjs(无需 sinon)即可轻松完成此任务。

只需使用jest.spyOb函数来监视sound函数,就可以模拟这个函数的结果:

const { Cat } = require('./myClass');

describe('Main tests', () => {
  beforeEach(() => {
    jest.spyOn(Cat, 'sound');
  });

  afterEach(() => {
    jest.resetAllMocks();
  });

  describe('Test Cat', () => {
    it('Meows', () => {
      // Don't mock, just call actual logic
      expect(Cat.sound()).toBe('Meow');
    });
  });

  describe('Test Dog', () => {
    it('Barks', () => {
      Cat.sound.mockReturnValue('Woof'); // mock return value of `sound()`

      expect(Cat.sound()).toBe('Woof');
    });
  });
});