使用多个文件中的超级测试进行Nodejs API测试的正确方法?

时间:2020-02-27 06:31:04

标签: node.js mocha supertest

我已经编写了一些API,我想使用supertest编写测试用例。我有两个文件,index.js和tester.js。

index.js

import tester from './tester';

const supertest = require('supertest');
const randomString = require('randomstring');
const app = require('../../dist/server');

const request = supertest(app);


describe('User signup and login', () => {

  tester(request);

  it('Signup -> New user signup test', (done) => {
    request.post('/users')
      .send(`userName=test${randomString.generate(7)}&password=12345678&firstName=name&lastName=name`)
      .set('Accept', 'application/json')
      .expect('Content-Type', /json/)
      .expect(201)
      .end((err, res) => {
        if (err) {
          return done(err);
        }
        return done();
      });
  });
});

tester.js

const randomString = require('randomstring');

export default function tester(request) {
  describe('testter ', () => {
    it('Signup -> New user signup test', (done) => {
      request.post('/users')
        .send(`userName=test${randomString.generate(7)}&password=12345678&firstName=nigilan&lastName=palladium`)
        .set('Accept', 'application/json')
        .expect('Content-Type', /json/)
        .expect(201)
        .end((err, res) => {
          if (err) {
            return done(err);
          }
          return done();
        });
    });
  });
}

现在,当我运行index.js文件时,它将运行两个测试用例。这是正确的方法吗?

1 个答案:

答案 0 :(得分:1)

将测试嵌入功能内部

我不了解tester.js的目的。设置有点奇怪。但是您确实编写了两次相同的测试,并且通过在tester块内调用describe函数,实际上是将测试放在该块内。我建议不要在此类函数中包装测试块,除非您迫切需要这样做。

超级测试的使用

我认为应该在每次测试中初始化超级测试,即不要编写

const request = supertest(app);

describe('User signup and login', () => {
  it('Signup -> New user signup test', (done) => {
    request.post('/users')

这样写:

describe('User signup and login', () => {
  it('Signup -> New user signup test', (done) => {
    const request = supertest(app);
    request.post('/users')

如果您需要使用实际的代理来验证某些cookie功能,这变得至关重要。在这种情况下,代理将cookie保持在其内部状态,并且您最肯定不希望在测试之间共享该状态。

将测试标记为已完成

Mocha的done函数可以直接传递给expect,因此无需编写:

.expect(201)
.end((err, res) => {
          if (err) {
            return done(err);
          }
          return done();
        });

你可以写

.expect(201, done);

或者,supertest也可以用作promise,而mocha支持promise,因此您可以编写

it("signup ...", () => {
    return request.post('/users') 
        ...
        .expect(201);
});

因此,这意味着expect的返回值具有then函数。该函数是否被实际调用将确定它的行为是否符合promise或处于“旧版”模式。如果您在mocha测试中返回了promise,mocha将调用then,并使用promise行为。