Man*_*lon 6 node.js es6-promise jestjs
我正在尝试测试一个应用程序,但jest.spyOn让我发疯。
我正在研究节点 v8.9.4 和 jest v22.2.2
我已经提取了这段代码:
// my-module.js
class MySingletonModule {
constructor() {
this.foo = 'bar';
}
myPromise() {
return new Promise((resolve, reject) => resolve(this.foo));
}
}
module.exports = new MySingletonModule();
Run Code Online (Sandbox Code Playgroud)
// promise.test.js
const singleton = require('./my-module');
describe('Module test-suite', () => {
let spy;
beforeAll(async () => {
spy = jest.fn();
spy = jest.spyOn(singleton, 'myPromise');
});
beforeEach(() => spy.mockReset());
test('Check bar', () => {
return singleton.myPromise().then((bar) => {
expect(bar).toEqual('bar');
});
});
test('Check called times', () => {
singleton.myPromise();
expect(spy).toHaveBeenCalledTimes(1);
});
afterAll(() => {
jest.restoreAllMocks();
});
});
Run Code Online (Sandbox Code Playgroud)
该Check bar测试失败,因为该myPromise方法不返回一个承诺:

如果我评论spy = jest.spyOn(singleton, 'myPromise');测试有效..但显然另一个测试不起作用..

我希望所有测试都可以使用spyOn,因为阅读文档是这样写的:
注意:默认情况下, jest.spyOn 也会调用 spied 方法。
我错过了什么?
谢谢您的帮助
这是没有茉莉花的工作片段:
describe('Module test-suite', () => {
let spy;
beforeAll(() => { // get rid of async
spy = jest.fn();
spy = jest.spyOn(singleton, 'myPromise');
});
afterEach(() => spy.mockRestore()); // main difference is here
test('Check bar', () => {
return singleton.myPromise().then((bar) => {
expect(bar).toEqual('bar');
});
});
test('Check called times', () => {
singleton.myPromise();
expect(spy).toHaveBeenCalledTimes(1);
});
afterAll(() => {
jest.restoreAllMocks();
});
});
Run Code Online (Sandbox Code Playgroud)
我认为最好使用mockRestore而不是mockReset,因为据我从jest 文档 mockReset中了解到,几乎无法清除有关间谍和间谍对象的所有信息。并且mockRestore只是清除一些临时数据,例如调用次数。
为什么使用afterEach而不是beforeEach重要 - 我不知道:(
我还删除了async它,因为测试失败了。
| 归档时间: |
|
| 查看次数: |
20078 次 |
| 最近记录: |