Javascript 使用jest框架模拟基类
我有一个基类,如下所示Javascript 使用jest框架模拟基类,javascript,unit-testing,jestjs,Javascript,Unit Testing,Jestjs,我有一个基类,如下所示 class BaseClass { ..... ..... async request(options) { ....... ....... } } 这是由另一个类似这样的类扩展的 const BaseClass = require('@myorg/base-class').BaseClass; class MyClass extends BaseClass { async method1() { ....
class BaseClass {
.....
.....
async request(options) {
.......
.......
}
}
这是由另一个类似这样的类扩展的
const BaseClass = require('@myorg/base-class').BaseClass;
class MyClass extends BaseClass {
async method1() {
.............
request()
.............
}
async method2() {
.............
request()
.............
}
}
describe('MyClass', () => {
afterEach(() => {
jest.clearAllMocks();
jest.resetAllMocks();
});
let MockClass = class BaseClass {
request() {
return {
statusCode: 200,
body: JSON.stringify({
first_response: 'first_response'
})
};
}
};
const mock = jest.mock('@myorg/base-class', () => {
return {
BaseClass: MockClass
};
});
it('#method1 - test method one', async () => {
const myClass = require('../src').myClass;
const res = await myClass.method1();
expect(res).toEqual('first_response');
});
it('#method2 - test method 2', async () => {
mock.clearAllMocks();
mock.resetAllMocks();
MockClass = class BaseClass {
request() {
return {
statusCode: 200,
body: JSON.stringify({
random_response: 'random_response'
})
};
}
};
const myClass = require('../src').myClass;
const res = await myClass.method2();
expect(JSON.parse(res.body)).toEqual({
random_response: 'random_response'
});
expect(res.statusCode).toEqual(200);
});
});
现在我使用jest测试MyClass及其2个方法,模拟基类,并尝试为其请求方法发送模拟响应。因为我需要同时测试method1和method2,所以我需要在第一个之后更改模拟返回。我就是这样做的
const BaseClass = require('@myorg/base-class').BaseClass;
class MyClass extends BaseClass {
async method1() {
.............
request()
.............
}
async method2() {
.............
request()
.............
}
}
describe('MyClass', () => {
afterEach(() => {
jest.clearAllMocks();
jest.resetAllMocks();
});
let MockClass = class BaseClass {
request() {
return {
statusCode: 200,
body: JSON.stringify({
first_response: 'first_response'
})
};
}
};
const mock = jest.mock('@myorg/base-class', () => {
return {
BaseClass: MockClass
};
});
it('#method1 - test method one', async () => {
const myClass = require('../src').myClass;
const res = await myClass.method1();
expect(res).toEqual('first_response');
});
it('#method2 - test method 2', async () => {
mock.clearAllMocks();
mock.resetAllMocks();
MockClass = class BaseClass {
request() {
return {
statusCode: 200,
body: JSON.stringify({
random_response: 'random_response'
})
};
}
};
const myClass = require('../src').myClass;
const res = await myClass.method2();
expect(JSON.parse(res.body)).toEqual({
random_response: 'random_response'
});
expect(res.statusCode).toEqual(200);
});
});
问题是,一旦模拟被初始化,我就不能像第二次测试那样重置和分配不同的值。我怎样才能做到这一点呢?一年前我也遇到过类似的问题。我有两个测试调用相同的模拟方法,但我希望有两个不同的输出 Jest并没有提供任何体面的方式来修改一个创建后的模拟,我想他们并没有改变这一点。(无法链接任何来源,抱歉,这是一段时间前的消息) 我有机会与一些经验丰富、才华横溢的程序员讨论,解决办法是在两个不同的文件中进行测试,其中有两个模拟的实现 简单,如果你遇到这个问题几次相当干净,但不方便,如果你必须经常这样做 请让我知道,如果你有更好的解决办法或修复
祝您好运一次查看
mockImplementation
,而不是调用mockImplementation
两次。也许会有帮助。好luck@BenoitMessiaen我做了一个小小的编辑。当我尝试使用时,MockImplementation()对我无效。我得到了一个TypeError:Class extends value undefined不是构造函数或null
error当单个方法调用模拟函数两次时,问题会变得复杂。