在每次测试之前重置数据库

时间:2019-10-07 16:55:42

标签: node.js supertest

我正在为一个简单的应用程序使用节点和超级测试。我为本地测试数据库安装了SQlite3。我做了一个简单的测试,将超级插入数据库。我想在每次运行测试时重置数据库。我正在寻找文档,但似乎找不到它。我想在这里问一下,因为似乎有人很可能会知道该信息。

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);
  });
});

4 个答案:

答案 0 :(得分:2)

如果要在每次测试前运行任何代码,可以在jest中使用beforeEach函数

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

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

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

答案 1 :(得分:0)

所以最好的方法是在Api的路由功能中加入一些逻辑

Receive an API request
Check if ['X-MOCK-HEADER'] exists
If it does then route to the mock version of the endpoint

因此,用于创建用户的模拟将始终返回201 OK-模拟端点将执行以下操作:

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

 return routes[HEADER_VALUE]()

之所以要在这种情况下测试路由而不是数据库类,是因为您只想返回静态数据,如果要测试其他内容,则只需将X-MOCK-HEADER值更改为所需的值即可,添加模拟路由以返回正确的http响应/代码-我需要知道API代码是什么样的,以帮助您实现后端实施。

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

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

答案 2 :(得分:0)

没有重置sqlite数据库的明确方法,只需删除该数据库并重新创建即可。

Sqlite: How do I reset all database tables?

答案 3 :(得分:0)

我在文件中做到了,而且效果很好

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);
  });
});