为typeorm创建单元测试时,我想模拟与数据库的连接,以便我可以运行单元测试而无需实际连接到数据库(这是一件好事!)
我看到places那里的人们使用testdouble(我也在使用)嘲笑typeorm的存储库,但是我正在尝试使用getManager来做到这一点,并且在解决问题上遇到了问题如何使其工作。
这是一个例子。我有一个在构造函数中的类,该类通过使用getManager()进行名为“ test”的连接来创建EntityManager:
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 :(得分:2)
我创建了一个small repository,它说明了如何模拟数据库以进行出色的单元测试:)
我尝试使用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())
})