3 回答

TA貢獻1828條經(jīng)驗 獲得超3個贊
模擬類實例的問題在于,如果沒有引用,可能很難訪問類實例及其方法。由于someService是組件模塊的本地文件,因此無法直接訪問。
沒有特定的模擬,jest.mock('./SomeService')依賴于 以未指定的方式工作的類自動模擬。該問題表明模擬類的不同實例具有不同的getObjects模擬方法,這些方法不會相互影響,盡管getObjects是原型方法并且符合new SomeService().getObjects === new SomeService().getObjects未模擬類。
解決方案是不依賴自動模擬,而是讓它按照預(yù)期的方式工作。使模擬方法可在類實例外部訪問的一種實用方法是將其與模擬模塊一起使用。這種方式mockGetObjects.mockImplementationOnce會影響現(xiàn)有的someService. mockImplementationOnce暗示該方法可以稍后在每個測試中更改實現(xiàn):
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
如果該方法應(yīng)該有常量模擬實現(xiàn),這會簡化任務(wù),因為可以在jest.mock. 暴露mockGetObjects斷言可能仍然是有益的。

TA貢獻1860條經(jīng)驗 獲得超8個贊
在使用 jest 文檔中建議的不同方法進行一些試驗和錯誤嘗試后,唯一似乎有效的方法是jest.mock()使用模塊工廠參數(shù)進行調(diào)用,如下所示:
// 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()它。
如果這導(dǎo)致任何人找到更優(yōu)雅或慣用的解決方案,我歡迎其他答案。

TA貢獻1785條經(jīng)驗 獲得超8個贊
對于后代,另一種解決方案是在文件夾中創(chuàng)建手動模擬__mocks__(靈感來自 Estus Flask 的評論和本文檔)。
./__mocks__/SomeService.js
export const mockGetObjects = jest.fn()
const mock = jest.fn(() => {
return {getObjects: mockGetObjects}
})
export default mock
然后普通jest.mock('./SomeService')調(diào)用與稍后在測試中定義的實現(xiàn)一起工作:
mockGetObjects.mockImplementationOnce(() => {
return Promise.resolve(object_data).then(response => response.data)
})
添加回答
舉報