我正在尝试为控制器方法编写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.uri
为undefined
,所以现在实际测试没有通过。