我有一个简单的功能,如;
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);
});
});
}
};
我想对resolve
和reject
结果进行单元测试。
一个简单的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
错误?
答案 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)
});
}