reactjs - 如何使用 jest 在回调中获取代码覆盖率?
问题描述
我在代码覆盖率方面遇到问题,无法弄清楚。我正在使用谷歌地理编码 API 来查询在回调函数中返回响应的坐标。Jest 用于测试。
这是带有回调的可测试调用:
const geocoder = new google.maps.Geocoder();
geocoder.geocode({address: address}, (results, status) => {
// want to get coverage in this block
// expected test results are OK and logging shows right results
});
这是测试。因为测试时google.maps默认不可用,所以找到了这样的解决方案:
it('test', () => {
const constructorSpy = spyOn(google.maps, 'Geocoder');
const geocoder = createSpyObj('Geocoder', ['geocode']);
constructorSpy.and.returnValue(geocoder);
geocoder.geocode = jest.fn((adr, callback) => callback(response, 'OK'));
// expected results that are all OK
});
createSpyObj https://stackoverflow.com/a/45319913/1756136:
const createSpyObj = (baseName, methodNames): { [key: string]: Mock<any> } => {
let obj: any = {};
for (let i = 0; i < methodNames.length; i++) {
obj[methodNames[i]] = jest.fn();
}
return obj;
};
而 google.maps 是在 setupTests.js 中定义的。未测试时,当 react 加载 google map 时 google.maps 可用
window.google = {
maps: {
Geocoder: {},
GeocoderStatus: {
OK: 'OK'
}
}
};
有什么我可以尝试或研究的想法吗?只有覆盖是问题,预期的结果很好。
解决方案
代码覆盖率实际上已经在这个实现中正常工作。问题是我没有在只有“if”子句的“if”子句中访问“else”语句。
也可以不监视,但定义为属性并运行测试:
it('test', () => {
Object.defineProperty(google, 'maps', {
value: {
Geocoder: function () {
return {
geocode: jest.fn((adr, callback) => callback(response, 'OK'))
}
}
}
});
// expect..
});
推荐阅读
- hive - 为什么 Hive 和 bigSQL 中存在 1 条记录的数据不匹配?
- android - Android Room 是否提供 SqliteOpenHelper onCreate() 和 onUpdate() 替代方案?
- python - python3.6模板中的cgal c++集成错误
- javascript - 为什么在 React 中删除后仍然从本地存储中获取数据?
- excel - Excel Sumif,Sumifs 在多列中有部分字符串?
- php - 从不同表中的类别 id 获取类别名称
- windows - 调用 driver.quit() 后 chromedriver.exe 在寡妇中不可杀死
- php - MyOb 重复联系人被推送到公司文件 API
- java - 如何从非主键表的休眠列表中选择数据,其中所有列的where子句数据都相同
- c# - 实体框架核心:ToList() 与 ToListAsync()