在JEST中使用URL参数测试API

piah890a  于 8个月前  发布在  Jest
关注(0)|答案(1)|浏览(102)

有一个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()
  };
}


TypeError:无法读取未定义的属性(阅读“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参数的方式是不正确的。有什么关于语法的线索吗?

vsikbqxv

vsikbqxv1#

req.params肯定是空的,因为你没有指定任何路由参数
路由参数是命名的URL段,用于捕获在URL中指定的值。捕获的值填充在req.params对象中,路径中指定的路由参数的名称作为其各自的键。
让我们看看如何定义,在你的server.jsindex.js简单地指定路由参数的路径的路由如下所示.例如:/path/: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()调用都会创建一个新的Test。
最后不要忘记发送response代码201,因为默认情况下所有端点的快速应答都是200

相关问题