使用sinon监控库

时间:2013-09-16 16:11:24

标签: javascript node.js tdd mocha sinon

我有以下代码来测试使用sinon:

var req = new MultiPartUpload({
    client: client,
    objectName: "/" + obj.func.destPath(),
    stream: obj.outStream,
    headers: headers
  }, function (err, body) {
    obj.debug('uploaded' + body);
  });

我必须测试这个对象的创建。我该怎么做?我尝试过:

var MultiPartUpload = require('knox-mpu');
var stub = sinon.createStubInstance(MultiPartUpload);
instance(obj, function () {
  expect(stub).to.have.been.called;
  done();
});

但它没有按预期工作。有什么建议吗?谢谢:))

编辑:

instance是创建MultiPartUpload对象的对象的istance。问题是无法更改实例签名,并且在创建实例的文件中需要MultiPartUpload库。

简而言之:我必须监视MultiPartUpload库,问题是无法以任何方式与使用库的istance进行通信。

3 个答案:

答案 0 :(得分:1)

来自文档:

  

使用给定函数创建一个新对象作为原型和存根   所有实现的功能。给定的构造函数不是   调用

这意味着sinon.createStubInstance(MultiPartUpload);将返回一个新的存根,所有原型函数都作为存根。如果调用了MultiPartUpload函数,我认为你正在寻找间谍的方法,所以有一种方法可以用存根覆盖MultiPartUpload

var MultiPartUpload = require('knox-mpu');
var stub = sinon.stub().returns(sinon.createStubInstance(MultiPartUpload));
MultiPartUpload = stub;
instance(obj, function () {
  expect(stub).to.have.been.called;
  done();
});

答案 1 :(得分:0)

让我发现它的工作的唯一方法就是这样:而不是:

 var MultiPartUpload = require('knox-mpu');

在实例代码中。我改成了:

MultiPartUpload = require('know-mpu');

然后在测试用例中我简单地说:

MultiPartUpload = sinon.spy();

instance(obj, function () {
  expect(MultiPartUpload).to.have.been.called;
  done();
});

有什么方法比这更好吗? (我不喜欢全球大战)。谢谢:))

答案 2 :(得分:0)

你有没有看过像https://github.com/felixge/node-sandboxed-module这样的东西?当您需要实例模块时,可以使用SandboxedModule将间谍替换为 knox-mpu

修改:我无法提供完整的工作示例,因为您没有向我们提供所有代码。但沙盒模块的工作原理如下:

var SandboxedModule = require('sandboxed-module')
  , MultiPartUploadSpy = sinon.spy()
  , expect = chai.expect
  , YourInstanceModule = SandboxedModule.require('your-instance-module', {
      requires: {'knox-mpu': MultiPartUploadSpy}
    })

instance(obj, function () {
  expect(MultiPartUploadSpy).to.have.been.called;
  done();
});