Javascript 为什么jest不调用我的模拟实现
我已经阅读了所有关于Jest的问题和文档,但是我仍然不知道为什么Jest看起来根本没有使用我的模拟实现Javascript 为什么jest不调用我的模拟实现,javascript,unit-testing,jestjs,mocking,Javascript,Unit Testing,Jestjs,Mocking,我已经阅读了所有关于Jest的问题和文档,但是我仍然不知道为什么Jest看起来根本没有使用我的模拟实现 我正在测试的代码确实按照预期工作 我试图模仿XMLHttpRequest 我想在多个单元测试中共享我的模拟 我不确定我是否应该遵循有关模拟ES6类的说明。XMLHttpRequest是窗口对象的一个方法,实际上不是一个类,但类只是一个返回对象的函数,所以XMLHttpRequest可能毕竟是一个类 因为我想共享我的mock,所以我认为它适合手动mock的模式,只是XMLHttpRequest不
函数mainMock(){
让readyState=4;
让状态=200;
让statusText='OK';
让responseText=‘模拟数据’;
让响应={};
设错误=null;
const open=jest.fn();
const onreadystatechange=jest.fn();
const send=jest.fn(函数send(){
如果(错误)抛出错误;
此.onreadystatechange();
});
const addEventListener=jest.fn(函数addEventListener(e,c){
this.onreadystatechange=c;
});
函数setStatus(newStatus=200,newStatusText=OK,newReadyState=4){
状态=新闻状态;
statusText=newStatusText;
readyState=newReadyState;
}
函数setResponseText(newResponseText){
responseText=新responseText;
响应={};
}
函数setResponse(newResponse){
responseText=JSON.stringify(newResponse);
响应=新响应;
}
函数setError(newError){
error=newError;
}
函数清理(){
if(window.XMLHttpRequest){
删除window.XMLHttpRequest;
}
}
//将替换窗口XMLHttpRequest的模拟构造函数
函数mockConstructor(){
返回{
重新启动,
地位
状态文本,
响应文本,
答复,,
打开
onreadystatechange,
addEventListener,
送,
};
}
//重写/定义XMLHttpRequest
window.XMLHttpRequest=mockConstructor;
返回{
打开
onreadystatechange,
addEventListener,
清理,,
塞斯塔特斯,
setResponseText,
setResponse,
设置错误,
送,
};
}
导出默认的mainMock;
这是我的(缩写)单元测试
从'~mocks/XMLHttpRequestMock'导入XMLHttpRequestMock';
从“./Service”导入{Service};
让我们来看看HttpRequest;
在每个之前(()=>{
mockXMLHttpRequest=XMLHttpRequestMock();
});
之后(()=>{
mockXMLHttpRequest.cleanUp();
});
描述('服务',()=>{
它('should-ping',async()=>{
mockXMLHttpRequest.setResponse({
元:{version:99},
数据:{},
});
const service=新服务();
const meta=wait service.ping();
expect(mockXMLHttpRequest.open).toHaveBeenCalled();
expect(mockXMLHttpRequest.send).tohaveBeenCall();
expect(元版本).toEqual(99);
期望值(元状态),toEqual(200);
});
});
我正在测试的类肯定会调用open
和send
方法,因为它实际上可以工作并从服务器中提取数据,但是expect(mockXMLHttpRequest.open)
失败,如果我先调用,那么所有其他expect
调用也会失败。似乎Jest根本没有使用mock
我该怎么办
为了完成这幅图,这是我正在测试的类的一个稍微精简的版本
从'~config/configVars'导入配置变量;
导入“再生器运行时/runtime.js”;
出口类服务{
建造师(记录器){
this.logger=记录器| |控制台;
}
_getJson(请求){
常数this=这个;
返回新承诺(功能(解决、拒绝){
var xhttp=newXMLHttpRequest();
xhttp.responseType=request.responseType | | |“json”;
xhttp.onreadystatechange=函数(){
if(xhttp.readyState==XMLHttpRequest.DONE){
如果(this.status>=200&&this.status<300){
解决(这个问题);
}否则{
设e={
状态:这个状态,
statusText:this.statusText,
};
拒绝(e);
}
}
};
让url=configVars.service.url+request.url;
xhttp.open('GET',url,true);
xhttp.setRequestHeader('Accept',request.Accept | | |'application/json');
试一试{
xhttp.send();
}捕获(e){
拒绝(e);
}
});
}
异步ping(){
试一试{
让xhttp=等待它;
设meta=xhttp.response.meta;
meta.status=xhttp.status;
meta.statusText=xhttp.statusText;
返回元;
}捕获(e){
e、 messages=e.messages | |[];
e、 messages.push(“Ping服务失败”);
返回e;
}
}
}
导出默认服务;
在费尽周折并试图弄清楚如何让VS代码调试器通过Jest测试后,我终于找到了一个非常简单的方法
我没有模拟setRequestHeader
,这导致我的类在调用send
方法之前抛出异常