使用sinon间谍恢复或重置的正确方法是什么?

时间:2016-08-31 08:17:58

标签: javascript unit-testing mocha sinon chai

我有mocha,sinon和chai的测试服装:

describe('general visor methods tests', () => {

    let res, req, next, resSpy, resNext;

    beforeEach(() => {
        res = {};
        next = () => {};
        resSpy = res.json = sinon.spy();
        resNext = next = sinon.spy();
    });
    afterEach(() => {
        resSpy.restore();
        resNext.reset();
    });


describe('get basemap layers from owner model', () => {
    it('should send the basemap provided by the owner model', () => {
        owner.basemap = ['basemap1', 'basemap2'];
        getBaseMapLayersFromConfig(req, res, next);
        //  console.log(resSpy.args[0][0].data);
        expect(resSpy.calledOnce).to.eql(true);
        expect(resSpy.args[0][0].message).to.eql('basemaps correctly found');
        expect(resSpy.args[0][0].data).to.eql(['basemap1', 'basemap2']);
    });

...

如果我放resSpy.reset()它可以正常工作。我已经读过reset()函数是为了重置间谍的状态。

但我不明白的是,如果我放入resSpy.restore(),那么它会发出下一个错误:

TypeError: resSpy.restore is not a function

我不知道我做错了什么,或者使用恢复的正确方法是什么。

此外,我不知道何时应该使用重置或恢复。

1 个答案:

答案 0 :(得分:11)

spy.restore()仅在您使用以下初始化时才有用:

let someSpy = sinon.spy(obj, 'someFunction');

这将替换 obj.someFunction间谍。如果您想要返回原始版本,请使用someSpy.restore()

您正在使用独立的间谍,因此无法恢复。

此外,由于您在beforeEach中为每项测试创建了新的间谍,因此您无需重置afterEach中的任何内容。这只有在你想重用间谍时才有用:

describe('general visor methods tests', () => {
  let someSpy = sinon.spy(); // create the spy once

  afterEach(() => {
    someSpy.reset(); // reset after each test
  });

  ...
});