我要使用jest.mock(模块名称,工厂,选项) https://jestjs.io/docs/en/jest-object#jestmockmodulename-factory-options嘲笑sequelize
手动模块。
单元测试解决方案:
index.ts
:
import { Sequelize, DataTypes } from 'sequelize';
export const setup_db = async (db_path: string) => {
const sequelizeContext = new Sequelize({
dialect: 'sqlite',
storage: db_path,
});
try {
await sequelizeContext.authenticate();
} catch (err) {
throw err;
}
const Table1 = sequelizeContext.define(
'table1',
{
fieldName_1: {
type: DataTypes.STRING,
},
},
{ tableName: 'table1' },
);
const Table2 = sequelizeContext.define(
'table2',
{
fieldName_1: {
type: DataTypes.STRING,
},
},
{ tableName: 'table2' },
);
(Table1 as any).hasMany(Table2);
await Table1.sync();
await Table2.sync();
};
index.test.ts
:
import { setup_db } from './';
import { Sequelize, DataTypes } from 'sequelize';
import { mocked } from 'ts-jest/utils';
jest.mock('sequelize', () => {
const mSequelize = {
authenticate: jest.fn(),
define: jest.fn(),
};
const actualSequelize = jest.requireActual('sequelize');
return { Sequelize: jest.fn(() => mSequelize), DataTypes: actualSequelize.DataTypes };
});
const mSequelizeContext = new Sequelize();
describe('64648688', () => {
afterAll(() => {
jest.resetAllMocks();
});
it('should setup db correctly', async () => {
const mTable1 = { hasMany: jest.fn(), sync: jest.fn() };
const mTable2 = { sync: jest.fn() };
mocked(mSequelizeContext.define).mockImplementation((modelName): any => {
switch (modelName) {
case 'table1':
return mTable1;
case 'table2':
return mTable2;
}
});
await setup_db(':memory:');
expect(Sequelize).toBeCalledWith({ dialect: 'sqlite', storage: ':memory:' });
expect(mSequelizeContext.authenticate).toBeCalled();
expect(mSequelizeContext.define).toBeCalledWith(
'table1',
{
fieldName_1: {
type: DataTypes.STRING,
},
},
{ tableName: 'table1' },
);
expect(mSequelizeContext.define).toBeCalledWith(
'table2',
{
fieldName_1: {
type: DataTypes.STRING,
},
},
{ tableName: 'table2' },
);
expect(mTable1.hasMany).toBeCalledWith(mTable2);
expect(mTable1.sync).toBeCalledTimes(1);
expect(mTable2.sync).toBeCalledTimes(1);
});
});
单元测试结果:
PASS src/stackoverflow/64648688/index.test.ts (16.442s)
64648688
✓ should setup db correctly (11ms)
----------|----------|----------|----------|----------|-------------------|
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files | 91.67 | 100 | 100 | 90.91 | |
index.ts | 91.67 | 100 | 100 | 90.91 | 12 |
----------|----------|----------|----------|----------|-------------------|
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 20.184s