2017-10-13 70 views
0

我想单元测试与摩卡+ chai + sinon控制器方法,但我努力了解断言如何与这些异步方法工作。下面是我的测试:异步测试从来没有调用完成()如果断言失败

it('should fetch all registered books and send them as json', (done) => { 
    res.json = sandbox.spy(); 
    const books = []; 

    BookMock.expects('find').withArgs() 
    .resolves(books); 

    booksController.index(req, res,() => { 
    res.json.should.have.been.calledWith(200, { data: books }); 
    done(); 
    }); 
}); 

与这个测试的问题是,如果我改变断言期望的300代替200参数,例如,我的测试将停止(失败),并永远不会调用done(),导致一个通用的失败告诉没有比'测试失败,因为完成从来没有被称为',其中没有说与测试失败的原因没有关系。

如果我保持这样的测试,并且我的控制器方法做得很好,测试通过并且一切正常,但是如果控制器做了任何错误,测试失败并且不会告诉我失败的原因(哪个应该是“res.json没有用bla bla bla参数调用”)。

我也不确定这是单元测试控制器方法的正确方法,因为它们不会返回Promise我不能使用chai-as-promised或promise链,所以我使用了next()回调函数(它总是使用restify调用)来做出断言,这可能是不对的,所以我打开一个完整的重构来使这个测试最正确。

预先感谢您!

回答

0

挖一点点,我发现其他问题这样的回答:https://stackoverflow.com/a/26793989/4233017

所以我更新了我的代码,并包裹在一个try/catch断言,结束了像这样:

it('should fetch all registered books and send them as json', (done) => { 
    res.json = sandbox.spy(); 
    const books = []; 

    BookMock.expects('find').withArgs() 
    .resolves(books); 

    booksController.index(req, res,() => { 
    try { 
     res.json.should.have.been.calledWith(200, { data: books }); 
     done(); 
    } catch (e) { 
     done(e); 
    } 
    }); 
}); 

现在当测试失败时,它会给我正确的错误信息。如果答案是这样,我也可以用布尔值来做到这一点,但我认为这样更好。

任何其他解决方案仍然非常感激。