Mocha 测试蓝鸟驱动的节点样式回调

Mocha testing a bluebird powered node style callback

我在通过 运行 mocha 的考试时遇到了麻烦,这似乎是通过了。

测试:

describe('.get()',function() {

    it('should be called once',function() {
        // => Need to spy on this
        var callback = function(err,data) {
            console.log('I am called');
            if (err) {
                console.log('I am logging the error '+err);
            } else {
                console.log('I am logging the data '+data);
            }
        }

        agentMock._response = {body:'something',headers:'headers'};

        // => Start Spying
        var spy = sinon.spy(callback);
        sinon.spy(agentMock,'get');

        baseRequest.get(spy); // refer (a) below

        expect(agentMock.get).to.have.been.calledOnce;
        expect(spy).to.have.been.calledOnce;
        expect(spy).to.have.been.calledWith(null,'data');
    });
});

我想测试 callback 是否被调用。因此,我登录了回调的主体,stdout 也表明它正在被调用。

标准输出:

  .get()
    1) should be called once
I am called
I am logging the data something


  0 passing (15ms)
  1 failing

  1) .get() should be called once:
     AssertionError: expected spy to have been called exactly once, but it was called 0 times

详情:

(a) baseRequest.get return 数据作为 bluebird 承诺。这可以通过将 nodeback 传递给 .get 本身或通过在 .get 调用之后链接 .then 来使用。

BaseRequest.prototype.get = function(callback) {
    // inner details

    return invokeandPromisify(request,callback);
}

function invokeandPromisify(request, callback) {
    return new Promise(function(resolve,reject) {
    // Invoke the request
    request.end(function(err,result) {

        // Return the results as a promise
        if (err || result.error) {
            reject(err || result.error);
        } else {
            resolve(result);
        }
    });
    }).nodeify(callback); // to have a node style callback
}

会不会因为我想spycallback被传递给了不同的函数(这里是invokeandPromisify ) 并且间谍丢失了?我只是在解释这个。

此致。

您的测试应通过添加完成设置为异步。然后在你的回调函数中调用 done()

请检查http://mochajs.org/#asynchronous-code

因为 baseRequest#get returns 一个承诺,我会在承诺被解决后做出断言。

参见下面的示例:

it('should be called once',function(done) {
    // => Need to spy on this
    var callback = function(err,data) {
        console.log('I am called');
        if (err) {
            console.log('I am logging the error '+err);
        } else {
            console.log('I am logging the data '+data);
        }
    }

    agentMock._response = {body:'something',headers:'headers'};

    // => Start Spying
    var spy = sinon.spy(callback);
    sinon.spy(agentMock,'get');

    baseRequest.get(spy).finally(function() {
      expect(agentMock.get).to.have.been.calledOnce;
      expect(spy).to.have.been.calledOnce;
      expect(spy).to.have.been.calledWith(null,'data');
      done();
    });

});