node.js - 使用 Nodejs 和 Supertest 进行子域集成测试

标签 node.js jestjs

如何为具有子域的 Multi-Tenancy 应用程序编写集成测试。

我正在开发一个 Multi-Tenancy 应用程序。我正在尝试为子域编写集成测试,但似乎无法使其正常工作。

这是我所做的:

测试文件

import supertest from 'supertest';
import http from 'http';
import app from '../../../app';

const baseUrl = 'censio.lvh.me:7000';

describe('Censio tests', () => {
  let server;
  let request;

  beforeAll((done) => {
    server = http.createServer(app);
    server.listen(7000, done);
    request = supertest(server);
  });

  afterAll((done) => {
    server.close(done);
  });

  describe('Signin', () => {
    it('should respond with missing fields ...', async () => {
      const response = await request
        .post(`${baseUrl}/signin`)
        .send({})
        .set('Accept', 'application/json');

      expect(response.status).toBe(400);
    });
  });
});

app.js

import '@babel/polyfill';
import bodyParser from 'body-parser';
import cookieParser from 'cookie-parser';
import express from 'express';
import subdomain from 'express-subdomain';
import censioRouter from './tenants/censio';

const app = express();

app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(cookieParser());

// Subdomain definitions
app.use(subdomain('censio', censioRouter));

app.get('*', (req, res) => res.status(200).json({ message: 'Project started' }));

export default app;

当我检查response.text时我看到 <!DOCTYPE html> <html lang=\"en\"> <head> <meta charset=\"utf-8\"> <title>Error</title> </head> <body> <pre>Cannot POST /:7000censio.lvh.me/signin</pre> </body> </html>

它将帖子放在前面。当我删除端口时,我收到此错误:connect ECONNREFUSED 127.0.0.1:80

我该怎么办?

最佳答案

我终于让它工作了。我将这篇文章发布给将来可能需要此解决方案的人。

  • 首先,我充分了解了如何使用自定义域在本地测试我的应用程序。我必须修改我的 /etc/hosts 文件。 This post帮助了我。

  • 我修改了我的测试(如上面的问题所示)。我没有将 app 传递给 supertest,而是传递了我想要的基本 url,即包含我的子域的 url(censio.mydomain.com:myport)。这就是现在的样子。

    import supertest from 'supertest';
    import http from 'http';
    import app from '../../../app';
    
    describe('Censio tests', () => {
      describe('Signin', () => {
        let server;
        let request;
    
        beforeAll((done) => {
          server = http.createServer(app);
          server.listen(7000, done);
          request = supertest('http://censio.mydomain.com:7000');
        });
    
        afterAll((done) => {
          server.close(done);
        });
    
        it('should respond with missing fields ...', async () => {
          const response = await request
            .post('/signin')
            .send({})
            .set('Accept', 'application/json');
    
          expect(response.status).toBe(400);
        });
      });
     });
    

请注意,我更改了调用前后 Hook 的位置。

我希望这对你有帮助,就像它对我有帮助一样。

关于node.js - 使用 Nodejs 和 Supertest 进行子域集成测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53989762/

相关文章:

javascript - 使用 Node 运行程序时检查是否给出 ARGV

node.js - 可以填充两个级别吗?

unit-testing - Jest mock /监视 Mongoose 链式(查找、排序、限制、跳过)方法

javascript - 开 Jest 不尊重导入模块的模拟

javascript - "Cannot read property ' setState ' of undefined"即使它是绑定(bind)的

node.js - 如何通过 Jest 模拟 Node.js 中的 fetch 函数?

arrays - Coffeescript/Node.js : How to remove duplicate objects from an array of objects?

javascript - 如何将 result.insertId 分配给我在 query() 函数中传递的函数中的 id?

linux - 安装 keystone.js

reactjs - React Typescript 面临 enzyme 的问题