React API 测试与 Nock 失败并出现“错误:Nock:请求不匹配”

Posted

技术标签:

【中文标题】React API 测试与 Nock 失败并出现“错误:Nock:请求不匹配”【英文标题】:React API test with Nock failing with "Error : Nock : No match for request" 【发布时间】:2019-07-19 14:25:59 【问题描述】:

这是在后端和前端都可以正常工作的 Express Route 代码。

// 按vessel_type by_id 编辑/更新 - 工作中

router.put("/:id", (req, res, next) => 
  Vessel_Type.findByIdAndUpdate(
    req.params.id,
    req.body,

     new: true ,
    (err, updatedRecord) => 
      if (err) 
        console.error(err);
        return next(err);
       else 
        res.status(200).send(updatedRecord);
      
    
  );
);

这是我在 React 前端使用 nock 的 API 测试代码

  it("API test-3 - PUT (/api/vesseltype/id)", done => 
    nock(host)
      .defaultReplyHeaders(
        "access-control-allow-origin": "*",
        "Content-Type": "application/json"
      )
      .persist()
      .log(console.log)
      .put("/api/vesseltype/5c62cc8f1774b626cd7fdbe6", 
        vesseltype: "Super Large Cargo Ship-45"
      )
      .delayBody(1000)
      .reply(200, "PUT/EDIT data with reqheaders");

    axios
      .put("http://localhost:3000/api/vesseltype/5c62cc8f1774b626cd7fdbe6", 
        vesseltype: "Super Large Cargo Ship-45"
      )
      .then(response => 
        expect(response.data).toBe("PUT/EDIT data with reqheaders");
        expect(typeof response.data).toBe("string");
        done();
      );
  );

测试错误的控制台日志在终端中提供以下内容

    console.log node_modules/nock/lib/interceptor.js:332
    matching http://localhost:3000/api/vesseltype/5c62cc8f1774b626cd7fdbe6 to PUT http://localhost:3000/api/vesseltype/5c62cc8f1774b626cd7fdbe6: false

  console.error node_modules/jsdom/lib/jsdom/virtual-console.js:29
    Error: Error: Nock: No match for request 
      "method": "OPTIONS",
      "url": "http://localhost:3000/api/vesseltype/5c62cc8f1774b626cd7fdbe6",
      "headers": 
        "origin": "http://localhost",
        "access-control-request-method": "PUT",
        "user-agent": "Mozilla/5.0 (linux) AppleWebKit/537.36 (Khtml, like Gecko) jsdom/11.12.0",
        "host": "localhost:3000",
        "content-length": 0
      
    
        at Object.dispatchError (/home/paul/codes-Lap/React/Volteo/IES/IES-Rohan-WIP/client/node_modules/jsdom/lib/jsdom/living/xhr-utils.js:65:19)
        at EventEmitter.client.on.err (/home/paul/codes-Lap/React/Volteo/IES/IES-Rohan-WIP/client/node_modules/jsdom/lib/jsdom/living/xmlhttprequest.js:676:20)
        at EventEmitter.emit (events.js:202:15)

但是我的 PUT 路由 (http://localhost:3000/api/vesseltype/5c62cc8f1774b626cd7fdbe6) 在 nock 和 axios 之间完美匹配。

我已经解决了这些 github 问题和 SO 问题 here、here 和 here,但这些解决方案对我没有帮助。

【问题讨论】:

【参考方案1】:

显然您的框架/lib 在调用 PUT 之前调用了 OPTIONS 请求。 它与CORS有关。 Described here

你可以试试nocking OPTIONS。

【讨论】:

以上是关于React API 测试与 Nock 失败并出现“错误:Nock:请求不匹配”的主要内容,如果未能解决你的问题,请参考以下文章

Nock 在 Redux 测试中没有拦截 API 调用

使用 nock 和 mocha 测试身份验证时卡住

Nock 不适用于同时运行的多个测试

使用 PHP 时发布请求有效,但是当我将 Axios 与 React 一起使用时,它会失败并出现 500 内部错误,我该如何解决?

Redux 使用 jest、nock、axios 和 jsdom 测试 multipart/form-data

Nock 不能与 axios 一起使用获取操作异步测试