有一个 API 端点需要使用 Jest 进行集成测试。
这是终点:
http://localhost/universities/ucla/class/2013/studentalis/johndoe
。该请求是一个 put 请求,它在 Postman 上返回 201。
但是,当我测试它时
const express = require("express");
const request = require("supertest");
const updateStudentRoute= require('../handlers/updateStudent');
const app = express();
app.use(express.json());
app.use('/universities/ucla/class/2013/studentalis/johndoe', updateStudentRoute);
describe('Update Student Details in Databse', () => {
it('Update Student Details in Database', async() => {
const updateStudentRequestBody = require('./updateStudentRequestBody');
const response = await request(app).put(`universities/ucla/class/2013/studentalis/johndoe`)
.send(createInstanceRequestBody);
expect(response.statusCode).toBe(201);
});
});
测试返回超时,因为 updateStudent.js 文件中出现错误。其中,它无法解析 url 参数:
function getQuery(req, studentid, id) {
return {
universityName: req.params.universityName.toString(),
class: req.params.class.toString(),
studentAlias: req.params.studentAlias.toString()
};
}
类型错误:无法读取未定义的属性(读取“toString”)
226 | return {
> 227 | universityName: req.params.universityName.toString(),
| ^
228 | class: req.params.class.toString(),
229 | studentAlias: req.params.studentAlias.toString()
当我调试时,
req
是一个对象,req.params
是空的,因此req.params.universityName.toString()
是undefined
。所以我的猜测是我设置 url 参数的方式不正确。有关语法的任何线索吗?
肯定
req.params
将为空,因为您没有指定任何路线参数。
路由参数被命名为 URL 段,用于捕获 URL 中其位置处指定的值。捕获的值填充在
对象中,路径中指定的路由参数名称作为各自的键。req.params
让我们看看如何定义,在您的
server.js
或 index.js
只需在路由路径中指定路由参数,如下所示。例如:/path/:name
这里的 name 是路由参数
const express = require("express");
const updateStudentRoute= require('../handlers/updateStudent');
const app = express();
app.use(express.json());
// use put method instead use
app.put('/university/:universityName/class/:class/studentalias/:studentAlias', updateStudentRoute);
app.listen(2000,function(){
console.log("Server is running on port 2000");
});
您正在使用的另一件事是
app.use
而不是使用 app.put
因为
app.use()
用于将中间件绑定到您的应用程序。
到目前为止,您将对路线参数有所了解。让我们看看如何测试它们
在你的
test
js
const supertest = require("supertest");
const request = supertest("http://localhost:2000");
describe('Update Student Details in Databse', () => {
it('Update Student Details in Database', async() => {
// const updateStudentRequestBody = require('./updateStudentRequestBody'); put method does not have body
const response = await request.put(`/university/ucla/class/2013/studentalias/johndoe`); // here you can use the values in place of :name
expect(response.statusCode).toBe(201);
});
});
每次都传递
app
实例是没有必要的,如果您正在测试同一主机,您可以简单地通过初始化重新分配请求变量 url
,每个 request.VERB()
调用都会创建一个新的测试。
最后别忘了发送
response
代码201
,因为默认情况下,所有端点都会以200快速应答