每次测试前重置数据库

reset a database before each test

我正在为一个简单的应用程序使用节点和超级测试。我为本地测试数据库获取了 SQlite3。我做了一个简单的测试,将一个 super 插入到数据库中。每次测试 运行 时,我都想重置数据库。我现在正在查看文档,但似乎无法找到它。我想我会在这里问,因为似乎有人很可能知道这些信息。

const request = require('supertest');
const server = require('../server');

describe('Authentication', function() {

//database reset here

  it('should create a new user /users/registration', function(done) {
    request(server)
      .post('/users/register')
      .send({
        username: 'user-name',
        email: 'luser-name@gmail.com',
        password: '12345'
      })
      .set('Accept', 'application/json')
      .expect(201, done);
  });
});

所以最好的方法是在 Api

的路由功能中加入一些逻辑
Receive an API request
Check if ['X-MOCK-HEADER'] exists
If it does then route to the mock version of the endpoint

所以你创建用户的模拟总是 return 201 OK - 你的模拟端点会做这样的事情:

const routes = {
   CREATE_USER_OK:() => { return {....} } // make sure these return proper http responses
   CREATE_USER_BAD_REQUEST: () { return {...} }
}

 return routes[HEADER_VALUE]()

在这种情况下,原因是您测试的是路由而不是数据库 class,因此您只想 return 静态数据,如果您想测试其他内容,则只需更改 X -MOCK-HEADER 值到你想要的任何值并将模拟路由添加到 return 正确的 http response/code - 我需要知道 API 代码是什么样子来帮助你后端实现。

如果可能的话,不要乱用暂存数据库进行测试,因为随着它逐渐被垃圾填满,您将遭受很多痛苦。

此外,如果您正在使用前端应用程序,您可以使用静态数据快速制作原型 - 如果您有一个前端团队正在等待 API 端点说创建一个登录屏幕。

没有定义的方法来重置 sqlite 数据库,只需删除数据库并重新创建。

Sqlite: How do I reset all database tables?

如果你想在每次测试前运行任意一段代码,你可以使用jest

中的beforeEach函数
describe('my test', () => {
    beforeEach(() => {
       // code to run before each test
    });

    test('test 1', () => {
      // code
    });

   test('test 2', () => {
      // code
   });
});

我在文件中这样做了,效果很好

const request = require('supertest');
const server = require('../server');
const knex = require('knex');
const dbConfig = require('../knexfile.js')['test'];
const db = knex(dbConfig);

describe('Authentication', () => {
  beforeEach(async () => {
    await db('users').truncate();
  });

  it('should create a new user /users/registration', function(done) {
    request(server)
      .post('/users/register')
      .send({
        username: 'user-name',
        email: 'luser-name@gmail.com',
        password: '12345'
      })
      .set('Accept', 'application/json')
      .expect(201, done);
  });
});