如何用chai和mocha测试失败错误功能

时间:2018-01-17 13:22:57

标签: node.js socket.io mocha chai

大家好,我是测试的新手 我正在使用socket.io,我想在插入时发生某些事情时模拟我的函数抛出错误。

socket.on('request', function(request) {
  bookingService.addBooking(request)
  .then(function (booking) {
    winston.info('Client Order saved');
    io.emit('order to driver', {user: request[2], random : request[3]});
})
.catch(function (err) {
    winston.error(' Client error on save order ==> '+err);    
});

});

addBooking

function addBooking(msgParam) {
    var deferred = Q.defer();
    db.booking.insert(
        {   user    : msgParam[2],
            adress : msgParam[0],
            random  : msgParam[3],
            driver  : [],
            isTaken : false,
            isDone  : false,
            declineNbr : 0 ,
            createdOn  : msgParam[1],
            createdBy  : msgParam[2],
            updatedOn  : null,
            updatedBy  : []},
        function (err, doc) {
            if (err) deferred.reject(err.name + ': ' + err.message);

            deferred.resolve();
        });
    return deferred.promise;
}

我试图只测试addBokking函数

it('should throw error if something wrong happend on adding new order ', function(done){
  (bookingService.addBooking(request)).should.throw()
  done();
});

但我收到此错误

 AssertionError: expected { state: 'pending' } to be a function

2 个答案:

答案 0 :(得分:0)

您可以在chai中使用以下语法:

it("throw test", () => {
    expect(()=>{myMethodThatWillThrowError()}).to.throw();
});

对于承诺,您可以使用以下模式:

it("should throw on unsuccessfull request", (done: MochaDone) => {
    repo.patch({
        idOrPath: "Root/Sites/Default_Site",
        content: ConstantContent.PORTAL_ROOT,
    }).then(() => {
        done("Should throw");  // The test will fail with the "Should throw" error
    }).catch(() => {
        done();                // The test will report success
    });
});

答案 1 :(得分:0)

您正在检查承诺而不是结果

此错误:

  

AssertionError:期望{state:' pending'成为一个函数

...表示您正在检查从addBooking函数返回的承诺,而不是承诺的已解决/拒绝结果。

使用chai-as-promised,您可以轻松完成!

对于chai-as-promise,这些应该起作用(例如文档):

return promise.should.be.rejected;
return promise.should.be.rejectedWith(Error); // other variants of Chai's `throw` assertion work too. 

在您的特定情况下(在安装和连接chai-as-promised之后),这应该有效:

(bookingService.addBooking(request)).should.be.rejected

(也许should.throw()也可以使用chai-as-promised,我对它不太熟悉)

查看here: chai-as-promised