如何编写回送数据源的单元测试

问题描述

我希望在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

您可以通过多种方式解决该问题:

  1. 在使用Mocha的exit标志(docs)完成所有测试后,告诉Mocha退出该过程。我相信最近脚手架的LB4项目应该默认通过.mocharc.json文件启用此标志。

  2. 添加一个afterafterEach钩子以在测试后停止数据源。

     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
         });
       });
     });
    
  3. 向测试使用的数据源设置添加lazyConnect: true。这样可以防止连接器在数据源创建时启动数据库连接,并将连接推迟到发出第一个数据库请求之前。

     const ds = new MongodbDataSource({
       ...MongodbDataSource.defaultConfig,lazyConnect: true,});
    

这三种方法是独立的,您可以一起实现更多(或全部)它们。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...