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');
});
});
});
我正在尝试替换 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');
});
});
});