Cam*_*n K 3 javascript logging unit-testing reactjs jestjs
我需要测试当我正在测试的 addCampus 方法抛出错误时是否调用 logger() 函数。我对开玩笑还很陌生,所以我可能会错过一些简单的东西
记录器.js
function logger(level, message) {
//logs message to console
//has no explicit return
}
export default logger;
Run Code Online (Sandbox Code Playgroud)
添加校园列表.jsx
import logger from '../../Logger';
addCampus = campus => {
axios
.post('/api/campuses/', {
name: campus.campusName,
abbreviation: campus.campusAbbreviation,
})
.then(response => {
const { campuses } = this.state;
campuses.push(response.data);
this.setState({ campuses });
})
.catch(error => {
this.props.displayError(error);
logger('ERROR', error);
});
};
Run Code Online (Sandbox Code Playgroud)
AddCampusList.test.js
import logger from '../../../src/Logger.js'
...
it('calls displayError() with error', async () => {
getSpy = jest.spyOn(axios, 'get').mockRejectedValueOnce(error);
const logger = jest.fn();
const loggerSpy = jest.spyOn(logger, 'default');
wrapper = await shallow(<AddCampusList
displayError={displayError}
onSelectCampus={onSelectCampus}
selectedCampus={selectedCampus}
isMobileViewport={isMobileViewport}
/>);
expect(displayError).toHaveBeenCalledWith(error);
expect(loggerSpy).toHaveBeenCalled();
});
Run Code Online (Sandbox Code Playgroud)
expect(displayError) 工作正常,但expect(loggerSpy) 工作不正常。我尝试了几种不同的方法,但这是我最常遇到的错误
Cannot spy the default property because it is not a function; undefined given instead
> 105 | const loggerSpy = jest.spyOn(logger, 'default');
Run Code Online (Sandbox Code Playgroud)
该包logger已经是默认导入的,所以它不应该有default属性。
监视它的正确方法是:
import * as loggerMod from '../../../src/Logger'
...
const loggerSpy = jest.spyOn(loggerMod, 'default');
Run Code Online (Sandbox Code Playgroud)
这可能不起作用,因为 ES 模块是只读的,并且是否强制执行取决于设置。
更正确的方法是在模块模拟中执行此操作:
import logger from '../../../src/Logger'
jest.mock('../../../src/Logger.js', () => {
const loggerMod = jest.requireActual('../../../src/Logger');
return {
...loggerMod,
__esModule: true,
default: jest.fn(loggerMod.default)
};
});
...
expect(logger).toHaveBeenCalled();
Run Code Online (Sandbox Code Playgroud)
大多数时候,最好是模拟一个可能产生不良副作用的函数,而不是监视它,这要简单得多,特别是对于仅具有默认导出的模块:
jest.mock('../../../src/Logger', () => jest.fn());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8610 次 |
| 最近记录: |