如何测试在异步测试中返回promise的存根?

Ste*_*fan 9 javascript testing mocha.js promise sinon

如何以异步方式测试?

it('Should test something.', function (done) {

    var req = someRequest,
        mock = sinon.mock(response),
        stub = sinon.stub(someObject, 'method');

     // returns a promise
     stub.withArgs('foo').returns(Q.resolve(5));

     mock.expects('bar').once().withArgs(200);

     request(req, response);

     mock.verify();

});
Run Code Online (Sandbox Code Playgroud)

这是测试的方法.

var request = function (req, response) {

    ...

    someObject.method(someParameter)
        .then(function () {
            res.send(200);
        })
        .fail(function () {
            res.send(500);
        });

};
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我正在使用node.js,Q(用于承诺),sinon用于模拟和存根以及mocha作为测试环境.上面的测试由于请求方法的异步行为而失败,我不知道何时在测试中调用done().

Dav*_*lin 6

所有异步操作完成后,您需要调用done.你认为那会是什么时候?您通常会等到请求完成后如何?

it('Should test something.', function (done) {

   var req = someRequest,
       mock = sinon.mock(response),
       stub = sinon.stub(someObject, 'method');

    // returns a promise
    stub.withArgs('foo').returns(Q.resolve(5));

    mock.expects('bar').once().withArgs(200);

    request(req, response).then(function(){
       mock.verify();
       done();
    });

});
Run Code Online (Sandbox Code Playgroud)

将测试标记为在附加到请求承诺的错误回调中失败也可能是个好主意.