Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何测试NodeJ以查看是否使用了中间件?_Javascript_Node.js_Unit Testing_Express_Jestjs - Fatal编程技术网

Javascript 如何测试NodeJ以查看是否使用了中间件?

Javascript 如何测试NodeJ以查看是否使用了中间件?,javascript,node.js,unit-testing,express,jestjs,Javascript,Node.js,Unit Testing,Express,Jestjs,如果这是你不应该做的事情,请原谅我,但我已经环顾四周,看看有什么可能 我想验证我的express应用程序是否有一个称为/用于该应用程序的中间件 从“express”导入express; 从“cors”进口cors; 常量app=express(); app.use(cors());//res.send({hello:'world}); app.listen(5000,()=>console.log(`Listening on port 5000`)); 导出默认应用程序; 电位jest测试 从

如果这是你不应该做的事情,请原谅我,但我已经环顾四周,看看有什么可能

我想验证我的
express
应用程序是否有一个称为/用于该应用程序的中间件

从“express”导入express;
从“cors”进口cors;
常量app=express();
app.use(cors());//res.send({hello:'world});
app.listen(5000,()=>console.log(`Listening on port 5000`));
导出默认应用程序;
电位
jest
测试

从“/index.ts”导入应用程序;
//这是一个糟糕的尝试,试图让这个工作
测试('如果实施了CORS,则进行测试',()=>{
const mockCors=jest.mock('cors');
const myApp=app;
预计(模拟公司)。已被催收时间(1);
});

如果有人有解决方案,而我不应该这样做,那么背后的原因是什么?

我猜您实际上并不关心调用
cors
。您的客户不会对您说“我希望调用
cors
中间件”。客户机应该关心的是提供的服务,而不是它的实现方式。你的测试也应该这样做。如果有一天你决定为CORS使用另一个模块,你的测试不需要改变,为什么要改变呢

我(个人)喜欢的方法正是这样。测试表明,在给定一些输入的情况下,我的程序会提供我想要的输出。只要行为不变,程序内部的一切都可以更改。这将使您在重构时心平气和

此外,为了测试Express应用程序,您不需要服务器,您只需要该应用程序。实际上,启动服务器会增加测试的复杂性,因为如果在测试之后忘记关闭服务器,测试可能会挂起

因此在本例中,我要做的第一件事是将
index.ts
中的所有内容移动到名为
app.ts
的文件中,并删除这一行:

app.listen(5000, () => console.log(`Listening on port 5000`));
index.ts
中,只有以下内容:

import app from './app.ts';
// Start the server
app.listen(5000, () => console.log(`Listening on port 5000`));
然后,我将与Jest一起使用,向该应用程序发出请求:

npm i -D supertest
然后,在测试文件中,测试对客户端重要的内容:

import request from 'supertest';
import app from './app.js'; // Just import the app, not the server

describe("myApp", () => {
  it('should implement CORS', async() => {
    const { headers } = await request(app).get('/');
    expect(headers['access-control-allow-origin']).toEqual('*');
  });
});

我猜您实际上并不关心调用
cors
。您的客户不会对您说“我希望调用
cors
中间件”。客户机应该关心的是提供的服务,而不是它的实现方式。你的测试也应该这样做。如果有一天你决定为CORS使用另一个模块,你的测试不需要改变,为什么要改变呢

我(个人)喜欢的方法正是这样。测试表明,在给定一些输入的情况下,我的程序会提供我想要的输出。只要行为不变,程序内部的一切都可以更改。这将使您在重构时心平气和

此外,为了测试Express应用程序,您不需要服务器,您只需要该应用程序。实际上,启动服务器会增加测试的复杂性,因为如果在测试之后忘记关闭服务器,测试可能会挂起

因此在本例中,我要做的第一件事是将
index.ts
中的所有内容移动到名为
app.ts
的文件中,并删除这一行:

app.listen(5000, () => console.log(`Listening on port 5000`));
index.ts
中,只有以下内容:

import app from './app.ts';
// Start the server
app.listen(5000, () => console.log(`Listening on port 5000`));
然后,我将与Jest一起使用,向该应用程序发出请求:

npm i -D supertest
然后,在测试文件中,测试对客户端重要的内容:

import request from 'supertest';
import app from './app.js'; // Just import the app, not the server

describe("myApp", () => {
  it('should implement CORS', async() => {
    const { headers } = await request(app).get('/');
    expect(headers['access-control-allow-origin']).toEqual('*');
  });
});

我喜欢文件夹结构,但我确实想检查是否调用了
cors
。我的想法是,这不仅仅是cors,而是要看看开发人员在应该实现中间件时是否意外地禁用或注释了中间件。出于某种特殊原因,这是有效的还是不是一个好主意?我认为这取决于中间件。对于CORS,因为提供的特性就在请求-响应中,所以我认为测试该响应是一种更好的方法。但是,如果您有另一个中间件,例如,将请求记录到外部数据库,那么是的,模拟它会更有意义。您能为该实现提供一个示例吗?如果你这么做,我会非常感激的。此外,您是否发现在使用诸如
邮递员
超级测试
之类的工具时存在冗余?我现在还没有一个现成的解决方案,尽管可能需要探索。这里需要技巧的部分是,
cors()
在您导入模块时立即被调用。因此,在执行
导入…
之前,您可能需要对其进行模拟。至于超级测试和邮递员,是的,那将是多余的(2)测试代码库以进行维护不会很愉快我喜欢文件夹结构,但我确实想检查是否调用了
cors
。我的想法是,这并不是说它仅仅是cors,而是看看开发人员在应该实现中间件时是否意外地禁用或注释了中间件。这是有效的还是不好的有一个特别的原因吗?我认为这取决于中间件。对于CORS,因为提供的功能就在请求-响应中,所以我认为测试该响应是一种更好的方法。但是如果你有另一个中间件,例如,将请求记录到外部数据库,那么是的,模拟它会更有意义。你可以举个例子吗e对于该实现?如果您这样做了,我将不胜感激。此外,您是否发现在使用
Postman
supertest
之类的东西时存在冗余?我现在还没有一个现成的解决方案,尽管这可能是一个需要探索的方向。这里棘手的部分是
cors()导入模块时会立即调用
。因此,您可能需要在导入之前对其进行模拟…。对于Supertest&Postman,是的,这将是冗余的(要维护的两个测试代码库不是很令人愉快)