Sinon TypeError:尝试包装运行多个脚本时已经包装的<method>

时间:2017-06-23 12:20:01

标签: javascript node.js mocha sinon

使用sinon.js(和mocha)测试时出错。当我通过npm运行所有测试脚本时发生错误,但是当我通过IDE运行单个脚本时则不会。单独运行测试脚本可以正常工作,测试通过。

即。我有一个目录,里面有几个测试脚本。当我自己运行一个脚本时,测试通过。当我在目录中运行所有脚本时,tess失败并出现错误:

测试将失败

TypeError: Attempted to wrap getVariable which is already wrapped

虽然其他测试失败了:

TypeError: Cannot read property 'restore' of undefined

两个测试脚本都以相同的代码开头:

const
  assert = require('assert'),
  sinon = require('sinon');

global.context = {
  getVariable: function(s) {}
};

var contextGetVariableMethod;

beforeEach(function () {
  contextGetVariableMethod = sinon.stub(context, 'getVariable');
});

afterEach(function () {
  contextGetVariableMethod.restore();
});

我猜mocha同时运行两个测试?而且测试相互干扰。我很困惑为什么测试的范围不是独立的......也许是global的使用?

感谢

3 个答案:

答案 0 :(得分:1)

根据Sinon JS文档,如果你有var stub = sinon.stub(object, "method");
你必须使用object.method.restore();

进行恢复

所以,在你的情况下:

afterEach(function () {
    context.getVariable.restore()
});

答案 1 :(得分:0)

我想我已经成功解决了这个问题。对我有用的解决方案是重新声明在beforeEach方法中存根的对象。

例如:

const
  assert = require('assert'),
  sinon = require('sinon');

var contextGetVariableMethod;

beforeEach(function () {
  global.context = {
    getVariable: function(s) {}
  };
  contextGetVariableMethod = sinon.stub(context, 'getVariable');
});

afterEach(function () {
  contextGetVariableMethod.restore();
});

不完全确定为什么会这样,但是像这样构造代码似乎已经解决了问题

答案 2 :(得分:0)

如果您正在调用相同的功能,请检查是否有其他对象丢失了要还原的对象