Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么jest不调用我的模拟实现_Javascript_Unit Testing_Jestjs_Mocking - Fatal编程技术网

Javascript 为什么jest不调用我的模拟实现

Javascript 为什么jest不调用我的模拟实现,javascript,unit-testing,jestjs,mocking,Javascript,Unit Testing,Jestjs,Mocking,我已经阅读了所有关于Jest的问题和文档,但是我仍然不知道为什么Jest看起来根本没有使用我的模拟实现 我正在测试的代码确实按照预期工作 我试图模仿XMLHttpRequest 我想在多个单元测试中共享我的模拟 我不确定我是否应该遵循有关模拟ES6类的说明。XMLHttpRequest是窗口对象的一个方法,实际上不是一个类,但类只是一个返回对象的函数,所以XMLHttpRequest可能毕竟是一个类 因为我想共享我的mock,所以我认为它适合手动mock的模式,只是XMLHttpRequest不

我已经阅读了所有关于Jest的问题和文档,但是我仍然不知道为什么Jest看起来根本没有使用我的模拟实现

  • 我正在测试的代码确实按照预期工作
  • 我试图模仿XMLHttpRequest
  • 我想在多个单元测试中共享我的模拟
  • 我不确定我是否应该遵循有关模拟ES6类的说明。XMLHttpRequest是窗口对象的一个方法,实际上不是一个类,但类只是一个返回对象的函数,所以XMLHttpRequest可能毕竟是一个类

    因为我想共享我的mock,所以我认为它适合手动mock的模式,只是XMLHttpRequest不是一个模块,看起来手动mock只适用于模块

    这就是我写的模拟:

    函数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
    方法之前抛出异常