typescript - 如何模拟 typeORM 存储库

标签 typescript unit-testing mocking repository typeorm

我想编写一些测试并模拟 typeORM 存储库。 尝试了一些方法但无法解决它...(例如..@InjectRepository)...有什么想法吗?

import { AfterRoutesInit, Service } from '@tsed/common';
import { TypeORMService } from '@tsed/typeorm';
import { Connection, Repository } from 'typeorm';
import { DbAccount } from '../entity/DbAccount';
import { DbAddress } from '../entity/DbAddress';
import { Account } from '../models/Account';
import { Address } from '../models/address';
import { Pageable } from '../models/api_common/Pageable';

@Service()
export default class AccountService implements AfterRoutesInit {
    private repository: Repository<DbAccount>;
    private addressRepository: Repository<DbAddress>;

    constructor(private typeORMService: TypeORMService) { }

    $afterRoutesInit(): void | Promise<any> {
        const connection: Connection = this.typeORMService.get('default');
        this.repository = connection.getRepository(DbAccount);
        this.addressRepository = connection.getRepository(DbAddress);
    }

    async delete(accountId: string): Promise<void> {
        await this.repository.delete(accountId);

        return;
    }

}

最佳答案

我不知道你的问题是否解决了,但这里有一个解决方案:

import {TestContext} from "@tsed/testing";
import {TypeORMService} from "@tsed/typeorm";
import {expect} from "chai";
import * as Sinon from "sinon";
import {AccountService} from "./AccountService";
import {DbAccount} from "./DbAccount";
import {DbAddress} from "./DbAddress";

describe("AccountService", () => {
  before(() => TestContext.create());
  after(() => TestContext.reset());
  describe("afterRoutesInit()", () => {
    it("should initialise repository when afterRoutesInit event is emitted", () => {
      // GIVEN
      const connection = {
        getRepository: Sinon.stub()
      };
      const typeORMService = {
        get: Sinon.stub().returns(connection)
      };
      const dbAccountRepository = {name: "dbAccountRepository"};
      const dbAddressRepository = {name: "dbAddressRepository"};

      connection.getRepository
        .withArgs(DbAccount).returns(dbAccountRepository);
      connection.getRepository
        .withArgs(DbAddress).returns(dbAddressRepository);

      const service = TestContext.invoke<AccountService>(AccountService, [
        {
          provide: TypeORMService,
          use: typeORMService
        }
      ]);

      // WHEN
      service.$afterRoutesInit();

      // THEN
      expect(typeORMService.get).to.have.been.calledWithExactly("default");
      expect(service.repository).to.deep.eq(dbAccountRepository);
      expect(service.addressRepository).to.deep.eq(dbAddressRepository);
    });
  });
});

注意:我使用 chai 和 sinon 来编写单元测试:)

关于typescript - 如何模拟 typeORM 存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56978318/

相关文章:

node.js - Nodejs - Mocha、Chai 多重异步测试

java - 如何对预期在小程序安全管理器中运行的 Java 代码进行单元测试

objective-c - 我如何在 OCMock 中模拟接受句柄作为参数的方法?

Angular 与 TypeScript : ReferenceError: System is not defined System. 配置

html - 如何使用 typescript 不知道的运行时变量?

javascript - Typescript 导入 - 每个文件一个类约定

Angular 5 模板驱动的十进制输入

c# - 返回 IActionResult 的单元测试 Controller 方法

java - 如何创建以下方法的模拟测试

web-services - 如何从服务器端模拟复杂的 REST 调用?