Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在可选的全球职能部门:Sinon、mocha&;柴_Javascript_Testing_Mocha.js_Sinon_Chai - Fatal编程技术网

Javascript 在可选的全球职能部门:Sinon、mocha&;柴

Javascript 在可选的全球职能部门:Sinon、mocha&;柴,javascript,testing,mocha.js,sinon,chai,Javascript,Testing,Mocha.js,Sinon,Chai,我有一个方法可以检查是否定义了全局函数(它可能可用,也可能不可用,取决于每个客户端的请求)。如果定义了它,它将使用适当的数据调用它。否则,它将默默地失败。这是我们想要的行为 我想做的是测试它。有没有一种方法可以模拟和/或监视libFunction,这样我就可以确保使用正确的数据调用它一次(这里的函数非常简单,在调用过程中会进行一些数据处理) 下面是有问题的方法: function sendData(data) { let exists; try { // eslint-disab

我有一个方法可以检查是否定义了全局函数(它可能可用,也可能不可用,取决于每个客户端的请求)。如果定义了它,它将使用适当的数据调用它。否则,它将默默地失败。这是我们想要的行为

我想做的是测试它。有没有一种方法可以模拟和/或监视
libFunction
,这样我就可以确保使用正确的数据调用它一次(这里的函数非常简单,在调用过程中会进行一些数据处理)

下面是有问题的方法:

function sendData(data) {
  let exists;
  try {
    // eslint-disable-next-line no-undef
    if (libFunction) exists = true;
  } catch (e) {
    exists = false;
  }
  if (exists) {
    // eslint-disable-next-line no-undef
    libFunction(data);
  }
}
我曾尝试在测试中定义
libFunction
,然后将其删除,但这并不是我想要的:

describe('sendEvent', function () {

  function libFunction(data) {
    console.log('hi', data);
  }

  it('should call libFunction once', function () {
    var stub = sinon.stub(libFunction);
    var data = "testing";
    sendEvent(data);
    expect(stub.called).to.be.true;
  });
});
但是,此测试未通过:
AssertionError:预期未定义为true

我曾尝试过类似的间谍行为:

describe('sendEvent', function () {

  function libFunction(data) {
    console.log('hi', data);
  }

  it('should call libFunction once', function () {
    var spy = sinon.spy(libFunction);
    var data = "testing";
    sendEvent(data);
    expect(spy.called).to.be.true;
  });
});
这也会失败:
AssertionError:expected false为true


有办法做到这一点吗?

FWIW,我在试图解决在节点中存根全局方法的问题时遇到了这个问题。在我的例子中,这是可行的(我的示例使用了
Sinon.sandbox
,但是“常规的”
Sinon.spy
也应该可行):


FWIW,我在试图解决在节点中存根全局方法的问题时遇到了这个问题。在我的例子中,这是可行的(我的示例使用了
Sinon.sandbox
,但是“常规的”
Sinon.spy
也应该可行):


您可能想要
sinon.spy(窗口,'libFunction')
,您所做的是创建一个由
libFunction
支持的间谍,而不是监视
libFunction
。窗口没有定义,因为我没有在测试环境中模拟浏览器。还有其他方法吗?你可以尝试
global
而不是
window
。你可能想要
sinon.spy(window,'libFunction')
,你要做的是创建一个由
libFunction
支持的间谍,而不是监视
libFunction
。window没有定义,因为我不是在测试环境中模拟浏览器。还有其他方法吗?您可以尝试
global
而不是
window
    const encodeSpy = sandbox.spy(global, "encodeURIComponent");
   // later...
   Sinon.assert.calledWith(encodeSpy, {expectedParamValue});