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

时间:2018-07-23 15:46:01

标签: node.js typescript unit-testing typeorm testdoublejs

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吗?

1 个答案:

答案 0 :(得分:2)

我创建了一个small repository,它说明了如何模拟数据库以进行出色的单元测试:)

我尝试使用TypeORMJest覆盖所有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())
})