首页 > 解决方案 > 在多个文件中使用 supertest 进行 Nodejs API 测试的正确方法?

问题描述

我已经编写了几个 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 文件时,它会同时运行两个测试用例。这是正确的方法吗?

标签: node.jsmocha.jssupertest

解决方案


在函数中嵌入测试

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

超测的使用

我认为 supertest 的目的是在每个测试中初始化,也就是说,而不是写

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函数。该函数是否被实际调用将决定它是作为一个承诺,还是在“传统”模式下。如果你在 mocha 测试中返回了 Promise,mocha 会调用then,并且使用 Promise 行为。


推荐阅读