【发布时间】:2020-01-11 03:00:10
【问题描述】:
我有一个如下所示的基类。
class BaseClass {
.....
.....
async request(options) {
.......
.......
}
}
这是由另一个类似的类扩展的。
const BaseClass = require('@myorg/base-class').BaseClass;
class MyClass extends BaseClass {
async method1() {
.............
request()
.............
}
async method2() {
.............
request()
.............
}
}
现在我正在使用 jest 来测试 MyClass 和它的 2 种方法,并模拟 BaseClass 并尝试为其请求方法发送模拟响应。由于我需要同时测试 method1 和 method2,所以我需要在第一个之后更改模拟返回。我就是这样做的。
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);
});
});
问题是一旦模拟被初始化,我无法像第二次测试那样重置和分配不同的值。我怎样才能做到这一点?
【问题讨论】:
-
看看
mockImplementationOnce,而不是两次调用mockImplementation。可能会有所帮助。祝你好运 -
@BenoitMessiaen 我做了一点编辑。当我尝试使用时, MockImplementation() 对我不起作用。我收到了
TypeError: Class extends value undefined is not a constructor or null错误
标签: javascript unit-testing jestjs