每次测试前重置数据库
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);
});
});
我正在为一个简单的应用程序使用节点和超级测试。我为本地测试数据库获取了 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
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);
});
});