3 回答

TA贡献1828条经验 获得超3个赞
模拟类实例的问题在于,如果没有引用,可能很难访问类实例及其方法。由于someService是组件模块的本地文件,因此无法直接访问。
没有特定的模拟,jest.mock('./SomeService')依赖于 以未指定的方式工作的类自动模拟。该问题表明模拟类的不同实例具有不同的getObjects模拟方法,这些方法不会相互影响,尽管getObjects是原型方法并且符合new SomeService().getObjects === new SomeService().getObjects未模拟类。
解决方案是不依赖自动模拟,而是让它按照预期的方式工作。使模拟方法可在类实例外部访问的一种实用方法是将其与模拟模块一起使用。这种方式mockGetObjects.mockImplementationOnce会影响现有的someService. mockImplementationOnce暗示该方法可以稍后在每个测试中更改实现:
import { mockGetObjects }, SomeService from './SomeService';
jest.mock('./SomeService', () => {
let mockGetObjects = jest.fn();
return {
__esModule: true,
mockGetObjects,
default: jest.fn(() => ({ getObjects: mockGetObjects }))
};
});
...
mockGetObjects.mockImplementationOnce(...);
// instantiate the component
如果该方法应该有常量模拟实现,这会简化任务,因为可以在jest.mock. 暴露mockGetObjects断言可能仍然是有益的。

TA贡献1860条经验 获得超8个赞
在使用 jest 文档中建议的不同方法进行一些试验和错误尝试后,唯一似乎有效的方法是jest.mock()使用模块工厂参数进行调用,如下所示:
// rename data to start with 'mock' so that the factory can use it
const mock_data = {
data: require('./test_json/object_list_response.json'),
};
jest.mock('./SomeService', () => {
return jest.fn().mockImplementation(() => {
return {
getObjects: () => {
return Promise.resolve(mock_data).then(response => response.data)
}
};
});
});
// write tests
使用mockResolvedValue()没有用,因为我无法链接.then()它。
如果这导致任何人找到更优雅或惯用的解决方案,我欢迎其他答案。

TA贡献1785条经验 获得超8个赞
对于后代,另一种解决方案是在文件夹中创建手动模拟__mocks__(灵感来自 Estus Flask 的评论和本文档)。
./__mocks__/SomeService.js
export const mockGetObjects = jest.fn()
const mock = jest.fn(() => {
return {getObjects: mockGetObjects}
})
export default mock
然后普通jest.mock('./SomeService')调用与稍后在测试中定义的实现一起工作:
mockGetObjects.mockImplementationOnce(() => {
return Promise.resolve(object_data).then(response => response.data)
})
添加回答
举报