首页 > 解决方案 > 无法在使用 oracledb npm 的 nodejs typescript 类的开玩笑单元测试中模拟 oracledb.getConnection()

问题描述

这是使用 oracledb npm 执行查询或 getConnection 的 nodejs typescript 类。

我无法在开玩笑的单元测试中模拟 oraclebd getConnection。

如何为 executeQuery 编写单元测试。它显示要在 finally 块所有语句上完成的测试覆盖率。

我写了单元测试但是


import { Inject, Injectable } from '@nestjs/common';
import * as oracledb from 'oracledb';
import { ORACLE_DB_OPTIONS } from '../constant';
import { OracleDBOptions } from '../interface';
import { PromInstanceCounter, PromMethodCounter } from '@digikare/nestjs-prom';

@PromInstanceCounter
@Injectable()
export class OracleDBService {
  constructor(
    @Inject(ORACLE_DB_OPTIONS)
    private readonly oracleDbOptions: OracleDBOptions[],
  ) { }

  @PromMethodCounter()
 async executeQuery(
    dbName: string,
    query: string,
    bindValue: any[] = [],
  ) {
    let localConnection: any;
    try {
      const oracleDbOption = this.oracleDbOptions.filter(
        x => x.name === dbName,
      );
      if (!oracleDbOption) {
        throw Error('Connection string does not exist');
      }
      localConnection = await oracledb.getConnection({
        user: oracleDbOption[0].user,
        password: oracleDbOption[0].password,
        connectString: oracleDbOption[0].connectString,
      });
      const result = await localConnection.execute(query, bindValue);
      await localConnection.close();
      return result;
    } finally {
      if (localConnection) {
        try {
          await localConnection.close();
        } catch (err) {
          console.log('Error when closing the database connection: ', err);
        }
      }
    }
  }
  @PromMethodCounter()
  async getConnection(dbName: string) {
    const oracleDbOption = this.oracleDbOptions.filter(x => x.name === dbName);
    if (!oracleDbOption) {
      throw Error('Connection string does not exist');
    }

    const localConnection = await oracledb.getConnection({
      user: oracleDbOption[0].user,
      password: oracleDbOption[0].password,
      connectString: oracleDbOption[0].connectString,
    });

    return localConnection;
  }
}

getConnection() 方法的书面单元测试。



describe('OracleDbService', () => {
  let oracleDBService: OracleDBService;

  let oracleDBOptions = [
    {
      name: 'rfdest',
      user: 'rfdest',
      password: 'rfdest',
      connectString: 'alsyntstb.ohlogistics.com:1521/syntstb',
    },
    {
      name: 'DOCGENDEV',
      user: 'DOCGENDEV',
      password: 'DocGen$dev18',
      connectString: 'alsynwebd.ohlogistics.com/synwebd_maint',
    },
  ];

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      providers: [
        OracleDBService,
        {
          provide: ORACLE_DB_OPTIONS,
          useValue: oracleDBOptions,
        },
      ],
    }).compile();

    oracleDBService = module.get<OracleDBService>(OracleDBService);
  });

  it('should be defined', () => {
    expect(oracleDBService).toBeDefined();
  });
  it('getConnection success', () => {
    jest.fn(getConnection).mockReturnValue({
      execute: function() {},
      close: function() {},
    });
    oracleDBService.getConnection('rfdest').then(resolve => {
      expect(resolve).not.toBeNull();
    });
  });
  it('getConnection throw error', () => {
    jest.fn(getConnection).mockReturnValue({
      execute: function() {},
      close: function() {},
    });
    oracleDBService
      .getConnection('')
      .then(resolve => {
        expect(resolve).not.toBeNull();
      })
      .catch(reject => {
        expect(reject).not.toBeNull();
      });
  });
});

标签: node.jstypescriptjestjsnode-oracledb

解决方案


推荐阅读