所有测试后Jest / TypeORM清除数据库

时间:2019-11-09 12:36:33

标签: javascript testing jestjs typeorm

我想在所有玩笑测试之后或之前将所有条目删除到数据库中。

这是我的setup.js:

import { getConnection, getConnectionManager } from "typeorm"

beforeAll(async () => {
    const connectionManager = getConnectionManager()
    const connection = connectionManager.create({
        "type": "postgres",
        "host": "localhost",
        "port": 54320,
        "username": "test",
        "password": "test",
        "database": "test",
        "entities": ["../src/entities/*.ts"],
        "logging": false,
        "synchronize": true
    })
    await connection.connect()
})

afterAll(async () => {
    await getConnection().close()
})

我在typeorm文档中读到,“ synchronize”选项将用旧表覆盖旧表,而新表为空,但似乎不起作用。

这是我进行的测试:

describe('POST /create', () => {
    it('Create a user', async () => {
        const user: IStringTMap<string> = {
            firstName: 'John',
            lastName: 'Doe',
            email: 'john.doe@test.com',
            password: 'test123!',
        }

        const res: Response = await request(app)
            .post('/create')
            .send(user)
            .expect(200)

        expect(res.type).toEqual('application/json')
        expect(res.body.email).toBe('john.doe@test.com')
        expect(res.body.password).toBe(undefined)
    })
})

第一个yarn test有效,但是下一个无效(电子邮件已经存在)

有什么主意吗?

3 个答案:

答案 0 :(得分:0)

也许有点晚了,但是我也在寻找这个,这就是我想出的。

这只会删除实体内部的内容,而不是实体本身。

afterEach(async () => {

    // Fetch all the entities
    const entities = getConnection().entityMetadatas;

    for (const entity of entities) {
        const repository = await getConnection().getRepository(entity.name); // Get repository
        await repository.clear(); // Clear each entity table's content
    }
});

答案 1 :(得分:0)

您可能不必为此测试清除数据库。您也可以使用faker之类的库,并绕过电子邮件重复验证。 Faker每次测试都会产生一个独特的用户。将您的用户更改为:


import fake from 'faker';

const user: IStringTMap<string> = {
  firstName: faker.name.firstName(),
  lastName: faker.name.lastName(),
  email: faker.internet.email(),
  password: faker.internet.password()
}

答案 2 :(得分:0)

您可以使用单独的名称在e2e测试文件中设置新数据库,并在导入typeorm模块时设置dropSchema: true选项。您可以导入typeorm模块,就像在AppModule中导入一样导入