问题描述
我希望在Loopback 4项目中为mongodb数据源编写单元测试,但是我找不到任何示例。
以下是我的数据源:
import {inject,lifeCycleObserver,LifeCycleObserver} from '@loopback/core';
import {juggler} from '@loopback/repository';
const arrayStr: string[] = [];
const config = {
name: 'mongodb',connector: 'mongodb',// url: '',host: 'localhost',port: 27017,user: process.env.DB_USER,password: process.env.DB_PASSWORD,authSource: 'admin',database: 'testdb',ssl: false,// default to false
sslValidate: false,// default to false
useNewUrlParser: true,allowExtendedOperators: true,sslCA: arrayStr,};
// Observe application's life cycle to disconnect the datasource when
// application is stopped. This allows the application to be shut down
// gracefully. The `stop()` method is inherited from `juggler.DataSource`.
// Learn more at https://loopback.io/doc/en/lb4/Life-cycle.html
@lifeCycleObserver('datasource')
export class MongodbDataSource extends juggler.DataSource
implements LifeCycleObserver {
static dataSourceName = 'mongodb';
static readonly defaultConfig = config;
constructor(
@inject('datasources.config.mongodb',{optional: true})
dsConfig: object = config,) {
super(dsConfig);
}
}
我尝试编写基本的构造函数测试:
import {MongodbDataSource} from '../../../datasources';
import {expect} from '@loopback/testlab';
describe('MongoDB Datasource (unit)',() => {
// we recommend to group tests by method names
describe('consturctor()',() => {
it('basic constructor',() => {
const ds = new MongodbDataSource();
expect(ds.name).to.equal('mongodb'); // default name
});
});
});
但是,测试将挂起/停止并且未完成。感谢任何建议。
解决方法
创建新的数据源时,基础连接器(在您的情况下为loopback-connector-mongodb)将立即开始连接数据库的过程,并创建一个连接池。测试完成后,该池中打开的连接将阻止Node.js退出。
我个人认为这是LoopBack连接器实现中的一个错误,但这就是问题的原因。pp
您可以通过多种方式解决该问题:
-
在使用Mocha的
exit
标志(docs)完成所有测试后,告诉Mocha退出该过程。我相信最近脚手架的LB4项目应该默认通过.mocharc.json
文件启用此标志。 -
添加一个
after
或afterEach
钩子以在测试后停止数据源。describe('MongoDB Datasource (unit)',() => { let ds: MongodbDataSource; // Setup a hook to stop the datasource created by the test afterEach(() => ds && ds.stop()); describe('constructor()',() => { it('basic constructor',() => { // important: no `const` keyword,use the shared variable ds = new MongodbDataSource(); expect(ds.name).to.equal('mongodb'); // default name }); }); });
-
向测试使用的数据源设置添加
lazyConnect: true
。这样可以防止连接器在数据源创建时启动数据库连接,并将连接推迟到发出第一个数据库请求之前。const ds = new MongodbDataSource({ ...MongodbDataSource.defaultConfig,lazyConnect: true,});
这三种方法是独立的,您可以一起实现更多(或全部)它们。