你如何使用testdouble模拟typeorm的getManager?

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

Yeg*_*mba 7

我尝试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)