在 JEST 中使用 URL 参数测试 API

问题描述 投票:0回答:1

有一个 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 参数的方式不正确。有关语法的任何线索吗?

javascript api express jestjs supertest
1个回答
0
投票

肯定

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

快速应答
© www.soinside.com 2019 - 2024. All rights reserved.