Как вы издеваетесь над makeorm getManager с помощью testdouble?

При создании модульных тестов для typeorm я хочу смоделировать свое соединение с базой данных, чтобы я мог запускать модульные тесты, даже не подключаясь к БД (хорошо!)

Я вижу места, где люди издеваются над репозиториями typeorm, используя testdouble (который я тоже использую), но я пытаюсь сделать это с помощью getManager, и у меня возникает проблема с выяснением, как заставить это работать.

Вот пример. У меня есть класс, который в конструкторе создает EntityManager с помощью getManager() для соединения под названием "test":

export class TestClass {
    constructor() {
        const test: EntityManager = getManager('test');
    }
}

Теперь я хочу проверить, что я могу просто создать этот класс. Вот пример (с использованием mocha, chai и testdouble):

describe('data transformer tests', () => {
    it('can create the test class', () => {

        // somehow mock getManager here

        const testClass: TestClass = new TestClass();
        chai.expect(testClass, 'could not create TestClass').to.not.be.null;
    });
});

Когда я пытаюсь это, я получаю это сообщение об ошибке от typeorm:

ConnectionNotFoundError: Connection "test" was not found.

Вот некоторые из вещей, которые я пытался издеваться над getManager:

td.func(getManager)

та же ошибка, что и выше.

td.when(getManager).thenReturn(td.object('EntityMananger'));

получает сообщение:

Error: testdouble.js - td.when - No test double invocation call detected for 'when()'.

Любые идеи, что за волшебный соус здесь для насмешки getManager?

Ответ 1

Я попробовал sinon вместо testdouble. Я создал небольшой репозиторий, который показывает, как вы можете макетировать базу данных для ваших сверкающих юнит-тестов :)

Я пытался охватить все тестовые случаи TypeORM используя Jest и Mocha

пример

import * as typeorm from 'typeorm'
import { createSandbox, SinonSandbox, createStubInstance } from 'sinon'
import { deepEqual } from 'assert'

class Mock {
  sandbox: SinonSandbox

  constructor(method: string | any, fakeData: any, args?: any) {
    this.sandbox = createSandbox()

    if (args) {
      this.sandbox.stub(typeorm, method).withArgs(args).returns(fakeData)
    } else {
      this.sandbox.stub(typeorm, method).returns(fakeData)
    }
  }

  close() {
    this.sandbox.restore()
  }
}

describe('mocha => typeorm => getManager', () => {
  let mock: Mock

  it('getAll method passed', async () => {
    const fakeManager = createStubInstance(typeorm.EntityManager)
    fakeManager.find.resolves([post])

    mock = new Mock('getManager', fakeManager)

    const result = await postService.getAll()
    deepEqual(result, [post])
  })

  afterEach(() => mock.close())
})