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

ske*_*hat 6 unit-testing node.js 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);
        });
    });
  }
};
Run Code Online (Sandbox Code Playgroud)

我想单元测试既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');
      });
  });
Run Code Online (Sandbox Code Playgroud)

使用sinon或其他库,我怎么能让fetchUser函数抛出该reject错误?

Krz*_*ski 10

使用Mocha,ChaiSinon,它可以用stubbed方法实现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'})
        })
    });
});
Run Code Online (Sandbox Code Playgroud)

  • 是的,它进入`catch`语句,因为错误等于`{error:'My Error'}`.你还需要什么来证明它有效? (2认同)