Testing 定义了NestJS路由的单元测试

Testing 定义了NestJS路由的单元测试,testing,routes,jestjs,nestjs,Testing,Routes,Jestjs,Nestjs,我找到了关于确定路线的信息。而第一个答案正是我所需要的,而且很有效 import { Controller, Get, Request } from "@nestjs/common"; import { Request as ExpressRequest, Router } from "express"; @Get() root(@Request() req: ExpressRequest) { const router = req.app._r

我找到了关于确定路线的信息。而第一个答案正是我所需要的,而且很有效

import { Controller, Get, Request } from "@nestjs/common";
import { Request as ExpressRequest, Router } from "express";

@Get()
root(@Request() req: ExpressRequest) {
    const router = req.app._router as Router;
    return {
        routes: router.stack
            .map(layer => {
                if(layer.route) {
                    const path = layer.route?.path;
                    const method = layer.route?.stack[0].method;
                    return `${method.toUpperCase()} ${path}`
                }
            })
            .filter(item => item !== undefined)
    }
}
我希望能够对其进行单元测试

我的端到端测试很好

    it('/api (GET) test expected routes', async done => {
        const ResponseData = await request(app.getHttpServer())
            .get('/api')
            .set('Accept', 'application/json');

        expect(ResponseData.status).toBe(200);
        expect(ResponseData.headers['content-type']).toContain('json');
        expect(ResponseData.body.routes.length).toBeGreaterThan(2);
        done();         // Call this to finish the test
    });

我遇到的问题是,如何创建和传递单元测试的root()调用所需的请求部分。ExpressRequest不是一个简单地创建然后赋值的类或任何东西。目前这是一个很大的定义。我想一定有一种简单的方法来创建一个对象,但我还没有找到。

您可以利用该软件包来帮助创建对象的模拟。它可以将一个接口作为泛型,并返回一个与该类型兼容的完整jest模拟。

这看起来很有希望,但我希望能够测试我在代码中定义的路由是否可用。例如,代码返回带有HTTP动词的端点(“GET/api”、“GET/healthz”等)。有了这个mock,我就会失去它,除非我试图创建正在被解析的更深层次的结构。我试图测试的一部分是,返回的结构不会改变,因为其他东西正在使用它,我知道2条基本路径(如上)将始终存在,因此我可以测试它们是否以正确的格式存在。我不确定为什么会有否决票,因为我没有这样做,也没有看到任何注释来表明它。您的模拟想法可以用于创建要测试的对象。我只需要能够让它在没有模拟的情况下更有效,以测试它是否仍然有效。我相信人们会在否决投票时添加评论。人们会否决他们想要的投票。听起来你不只是想对功能进行单元测试,这意味着一个模拟将不太理想,尽管看起来你已经设置了一个合适的e2e测试。我链接的库非常适合轻松创建mock并为该mock分配值,并且可以深入对象树以分配值,这就是为什么我认为它在这里很有用的原因。