Как вы издеваетесь над getManager typeorm, используя 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
?
0 ответов
Я старался 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())
})