TypeError:在调用request.pipe时,dest.on不是Express Controller的Jest测试中的函数

我正在尝试为控制器方法编写Jest单元测试。我认为我已经添加了相关信息,但是如果需要,请提供更多背景信息。该方法采用外部URL并将其通过响应对象进行传递,因此最终用户可以看到内容,但看不到外部URL。运行测试时,我看到此错误:

TypeError: dest.on is not a function

  81 |   const s3HtmlUrl = `${process.env.APP_BASE_URL}/html/${req.params.api_name}.html`;
  82 |
> 83 |   request(s3HtmlUrl).pipe(res);
     |                      ^
  84 | };
  85 |

  at Request.Object.<anonymous>.Request.pipe (node_modules/request/request.js:1488:34)
  at Object.pipe [as api_details] (controllers/users/apisInfoController.js:83:22)
  at Object.api_details (tests/controllers/apisInfoController.test.js:91:30)

这是一个简单的测试,只是试图使其正确连接。以下是相关文件:

/tests/mocks/mockExpress.js

exports.res = () => {
  const res = {};
  res.status = jest.fn().mockReturnValue(res);
  res.json = jest.fn().mockReturnValue(res);
  res.render = jest.fn((uri,...elements) => { // the express framework"s render function takes in a uri and additional optional variables
    res.uri = uri;
    res.elements = elements;
    return (uri,elements);
  });
  res.redirect = jest.fn((uri,...elements) => {
    res.uri = uri;
    res.elements = elements;
    return (uri,elements);
  });
  return res;
};

/controllers/users/apisInfoController.js

const request = require("request");

// Display list of APIs per category
exports.api_details = async (req,res) => {
  console.log("params",req.params);
  const s3HtmlUrl = `${process.env.APP_BASE_URL}/html/${req.params.api_name}.html`;

  request(s3HtmlUrl).pipe(res);
};

/tests/controllers/apisInfoController.test.js

require("dotenv").config();

// libraries that the controller uses are imported so that sinon can stub out their functionality. This way dependencies are not actually being used.
const sinon = require("sinon");

let sandbox = sinon.createSandbox();

const mockedExpress = require("../mocks/mockExpress");    
const apisInfoController = require("../../controllers/users/apisInfoController");

jest.setTimeout(12000);

beforeEach(() => { sandbox = sinon.createSandbox(); }); // For more info on sinon sanboxes -> https://sinonjs.org/releases/latest/sandbox/
afterEach(() => { sandbox.restore(); }); 


describe("Tests api_details",() => {
  test("renders /apis/users/posts endpoint",async () => {
    const req = { params: { category: "users",api_name: "posts" } };
    const res = mockedExpress.res();
    await apisInfoController.api_details(req,res);
    expect(res.uri).toBe("apis/users/posts");
  });
});
  • 编辑

我将const res = {}文件中的mockExpress.js更改为const res = new http.ServerResponse(new http.IncomingMessage());。我不再看到错误,但是由于res.uriundefined,所以现在实际测试没有通过。

WOJIAXIAOMIAN3 回答:TypeError:在调用request.pipe时,dest.on不是Express Controller的Jest测试中的函数

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3106251.html

大家都在问