sinon spy 不在异步回调中包装方法
sinon spy not wrapping method in asynchronous callback
看来 sinon.spy(object, method)
没有按预期包装我的对象#method。
(我有一种不安的感觉,我看到了与 here and 描述的相同的问题,但我不明白为什么会这样。我之前已经实例化了我的对象调用 sinon.spy(...)
,据我所知,我没有使用任何缓存对象。)
完整的测试文件如下:
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);
的调用导致 'expected undefined to equal 1',如果我将其更改为 expect(spy.callCount).to.equal(1);
,我将得到 'expected 0 to equal 1'。
总之,这让我认为对 sinon.spy(...)
的调用没有按预期包装 ambit_parser.extractLineItems 方法,但我不明白为什么会这样。
问题是对 restore()
的调用位置:它不应该在测试函数的主体中。相反,将其放在 after()
块中。
发生的事情是在测试开始后立即调用 restore() 方法,因此在执行回调时,被监视的方法已经恢复,因此 sinon 将报告该方法从未被调用。
对原始代码的以下修改将按预期工作:
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
故事的寓意:确保仅在所有回调完成后调用 reset()
。
看来 sinon.spy(object, method)
没有按预期包装我的对象#method。
(我有一种不安的感觉,我看到了与 here and sinon.spy(...)
,据我所知,我没有使用任何缓存对象。)
完整的测试文件如下:
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);
的调用导致 'expected undefined to equal 1',如果我将其更改为 expect(spy.callCount).to.equal(1);
,我将得到 'expected 0 to equal 1'。
总之,这让我认为对 sinon.spy(...)
的调用没有按预期包装 ambit_parser.extractLineItems 方法,但我不明白为什么会这样。
问题是对 restore()
的调用位置:它不应该在测试函数的主体中。相反,将其放在 after()
块中。
发生的事情是在测试开始后立即调用 restore() 方法,因此在执行回调时,被监视的方法已经恢复,因此 sinon 将报告该方法从未被调用。
对原始代码的以下修改将按预期工作:
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
故事的寓意:确保仅在所有回调完成后调用 reset()
。