如何在TypeORM中使用sinon对链式函数进行存根

问题描述 投票:0回答:1

我目前在我的项目中使用TypeORM和Sinonjs。但是我不确定如何以正确的方式编写单元测试。尤其是如何对链接的函数调用进行存根,例如

  async find(id: number): Promise<User> {
    const user = await this.connection
      .getRepository(User)
      .createQueryBuilder("user")
      .where("user.id = :id", { id: id })
      .getOne();
    return user;
  }

我的测试文件

it('should return a data from db', async () => {
  let user = {
    id: 1,
    name: 'my name'
  };

  const getOne = Sinon.stub().resolves(user);
  const where = Sinon.stub().callsArg(0);
  const createQueryBuilder = Sinon.stub().callsArg(0);
  const connection = {
    getRepository: Sinon.stub()
  };

  connection.getRepository.withArgs(User).returns(createQueryBuilder);
  createQueryBuilder.withArgs('user').returns(where);
  where.withArgs('user.id = :id', { id: user.id }).returns(getOne);
});

我总是遇到此错误

TypeError:this.connection.getRepository(...)。createQueryBuilder不是一个函数

欢迎任何意见!非常感谢!

sinon typeorm
1个回答
0
投票

您应该使用sinon.stub(obj, 'method').returnsThis()

使存根返回其此值。

例如

index.ts

type User = any;

export const model = {
  connection: {
    getRepository(model) {
      return this;
    },
    createQueryBuilder(model) {
      return this;
    },
    where(query, bindings) {
      return this;
    },
    getOne() {
      console.log('get one');
    }
  },
  async find(id: number): Promise<User> {
    const user = await this.connection
      .getRepository('User')
      .createQueryBuilder('user')
      .where('user.id = :id', { id: id })
      .getOne();
    return user;
  }
};

index.spec.ts

import { model } from './';
import sinon from 'sinon';
import { expect } from 'chai';

describe('model', () => {
  describe('#find', () => {
    afterEach(() => {
      sinon.restore();
    });
    it('should find user', async () => {
      let mUser = {
        id: 1,
        name: 'my name'
      };

      const getRepository = sinon.stub(model.connection, 'getRepository').returnsThis();
      const createQueryBuilder = sinon.stub(model.connection, 'createQueryBuilder').returnsThis();
      const where = sinon.stub(model.connection, 'where').returnsThis();
      const getOne = sinon.stub(model.connection, 'getOne').resolves(mUser);

      const user = await model.find(1);
      expect(user).to.be.eql(mUser);
      expect(getRepository.calledWith('User')).to.be.true;
      expect(createQueryBuilder.calledWith('user')).to.be.true;
      expect(where.calledWith('user.id = :id', { id: 1 })).to.be.true;
      expect(getOne.calledOnce).to.be.true;
    });
  });
});

带有覆盖率报告的单元测试结果:

 model
    #find
      ✓ should find user


  1 passing (13ms)

---------------|----------|----------|----------|----------|-------------------|
File           |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
---------------|----------|----------|----------|----------|-------------------|
All files      |    86.21 |      100 |    55.56 |    84.62 |                   |
 index.spec.ts |      100 |      100 |      100 |      100 |                   |
 index.ts      |       50 |      100 |       20 |    42.86 |         6,9,12,15 |
---------------|----------|----------|----------|----------|-------------------|

源代码:https://github.com/mrdulin/mocha-chai-sinon-codelab/tree/master/src/stackoverflow/57843415

© www.soinside.com 2019 - 2024. All rights reserved.