Cle*_*man 13 unit-testing node.js typescript typeorm testdoublejs
在为typeorm创建单元测试时,我想模拟我与数据库的连接,这样我就可以运行单元测试,而无需连接到数据库(这是一件好事!)
我看到人们使用testdouble(我也在使用)嘲笑typeorm的存储库的地方,但我试图用getManager做这个,并且我正在解决如何使它工作的问题.
这是一个例子.我有一个类,在构造函数中,通过使用getManager()为名为'test'的连接创建一个EntityManager:
export class TestClass {
constructor() {
const test: EntityManager = getManager('test');
}
}
Run Code Online (Sandbox Code Playgroud)
现在我想测试我可以简单地创建这个类.这是一个示例(使用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;
});
});
Run Code Online (Sandbox Code Playgroud)
当我尝试这个时,我从typeorm获得此错误消息:
ConnectionNotFoundError: Connection "test" was not found.
Run Code Online (Sandbox Code Playgroud)
以下是我试图模拟getManager的一些事情:
td.func(getManager)
Run Code Online (Sandbox Code Playgroud)
与上面相同的错误.
td.when(getManager).thenReturn(td.object('EntityMananger'));
Run Code Online (Sandbox Code Playgroud)
得到消息:
Error: testdouble.js - td.when - No test double invocation call detected for `when()`.
Run Code Online (Sandbox Code Playgroud)
有什么想法魔法酱在这里嘲笑getManager
?
我尝试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())
})
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2326 次 |
最近记录: |