Sinon对单元测试'捕获'声明

时间:2016-11-30 06:27:17

标签: node.js unit-testing sinon chai

我有一个简单的功能,如;

module.exports = {
  fetchUser:function(myUserId) {
    return new Promise((resolve, reject) => {
      this.getUser(myUserId)
        .then(user => {
          // do logic // then return user

          return user;
        })
        .then(resolve)
        .catch(err => {
          // whoops there has been an error

          let error = { error: 'My Error' };

          reject(error);
        });
    });
  }
};

我想对resolvereject结果进行单元测试。

一个简单的chai测试将是;

var expect = require('chai').expect;
var user = require('./user');

describe('User module', function() {
  it('test fetchUser', function() {
    let _user = user.fetchUser('abc123');

    return _user
      .then(user => {
        expect(data).to.be.an('object');
      });
  });

使用sinon或其他库,我如何才能使fetchUser函数抛出reject错误?

2 个答案:

答案 0 :(得分:7)

使用 Mocha Chai Sinon ,可以使用存根方法getUser来实现。

const User = require("./fetchUserModule");

describe('User module', () => {
    beforeEach(() => User.getUser = sinon.stub());

    afterEach(() => User.getUser.reset());

    it('returns user if `getUser` returns data', () => {
        const user = {name: 'John'};
        User.getUser.withArgs("abc123").returns(Promise.resolve(user));

        return User.fetchUser("abc123").then(result => {
            expect(result).to.equal(user)
        }).catch(error => {
            expect(error).to.be.undefined;
        })
    });

    it('throws error if `getUser` is rejected', () => {
        User.getUser.withArgs("abc123").returns(Promise.reject());

        return User.fetchUser("abc123").then(result => {
            expect(result).to.be.undefined;
        }).catch(err => {
            expect(err).to.eql({error: 'My Error'})
        })
    });
});

答案 1 :(得分:2)

从您的"逻辑"中的任何内容开始这可能会引发错误。

如果不是,则需要存根this.getUser拒绝或抛出错误而不是返回数据。 sinon-as-promised个修补程序sinon.stub包含.resolves.rejects承诺帮助程序。

const sinon  = require('sinon')
require('sinon-as-promised')

为故障测试设置存根。

before(function(){
  sinon.stub(user, 'getUser').rejects(new Error('whatever'))
})

after(function(){
  user.getUser.restore()
})

然后捕获.fetchUser错误或使用chai-as-promised获取一些糖。

it('test fetchUser', function() {
  return user.fetchUser('abc123')
    .then(()=> expect.fail('fetchUser should be rejected'))
    .catch(err => {
      expect(err.message).to.eql('whatever')
    })
})

it('test fetchUser', function() {
  return expect(user.fetchUser('abc123')).to.be.rejectedWith(Error)
})

async如果你生活在新世界

it('test fetchUser', async function() {
  try { 
    await user.fetchUser('abc123')
    expect.fail('fetchUser should be rejected'))
  } catch(err) {
    expect(err.message).to.eql('whatever')
  }
})

作为旁注,您不需要在new Promise中包装已经返回承诺的内容,并且在链接多个.catch处理程序时要小心丢失错误信息。

fetchUser: function (myUserId) {
  return this.getUser(myUserId)
    .then(user => {
      //logic
      return user
    })
    .catch(err => {
      let error = new Error('My Error')
      error.original = err
      reject(error)
    });
}