sinon间谍不在异步回调中包装方法

时间:2015-11-20 08:59:42

标签: javascript mocha sinon

sinon.spy(object, method)似乎没有按预期包装我的对象#方法。

(我有一种不安的感觉,我看到了herehere所描述的相同问题,但我不明白为什么会这样。我已经实例化了调用sinon.spy(...)之前的对象和AFAIK我没有使用任何缓存的对象。)

这是完整的测试文件:

var 
AmbitParser = require('../lib/parsers/ambit-parser'),
expect = require('chai').expect,
sinon = require('sinon');

describe('AmbitParser', function() {
    var ambit_parser = new AmbitParser();

    describe('#extractLineItems()', function() {

        it('calls extractLineItems once', function(done) {
            var spy = sinon.spy(ambit_parser, 'extractLineItems');

            ambit_parser.parseBills(function gotBills(err, bills) {
                expect(ambit_parser.extractLineItems.callCount).to.equal(1); // => expected undefined to equal 1
                expect(spy.callCount).to.equal(1);                           // => expected 0 to equal 1
                done();
            });

            ambit_parser.extractLineItems.restore();
        });                     // calls extractLineItems once
    });                         // #extractLineItems
});                             // AmbitParser

expect(ambit_parser.extractLineItems.callCount).to.equal(1);的调用导致'预期未定义为等于1',如果我将其更改为expect(spy.callCount).to.equal(1);,我会得到'预期0等于1'。

总之,这让我觉得对sinon.spy(...)的调用没有按预期包装ambit_parser.extractLineItems方法,但我不明白为什么会出现这种情况。

1 个答案:

答案 0 :(得分:0)

问题是将调用放置到pm clear:它不应该位于测试函数的主体中。相反,将其放在restore()块中。

正在发生的是在测试开始后立即调用restore()方法,因此在执行回调时,已经恢复了spied on方法,因此sinon将报告该方法从未被调用过

对原始代码的以下修改将按预期工作:

after()

故事的道德:确保只有在任何回调完成后才召唤describe('AmbitParser', function() { var ambit_parser = new AmbitParser(); describe('#extractLineItems()', function() { before(function() { sinon.spy(ambit_parser, 'extractLineItems'); }); after(function() { ambit_parser.extractLineItems.restore(); }); it('calls extractLineItems once', function(done) { ambit_parser.parseBills(function gotBills(err, bills) { expect(ambit_parser.extractLineItems.callCount).to.equal(1); done(); }); }); // calls extractLineItems once }); // #extractLineItems }); // AmbitParser