0

我有以下代码可以使用 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 对象的对象的距离。问题是无法更改实例签名,并且创建实例的文件中需要 MultiPartUpload 库。

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

4

3 回答 3

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();
});
于 2013-09-16T18:57:15.567 回答
0

您是否查看过类似https://github.com/felixge/node-sandboxed-module的内容?当您需要实例模块时,您可以使用 SandboxedModule 将 spy 替换为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();
});
于 2013-09-17T12:17:44.570 回答
0

我发现使它工作的唯一方法是:而不是:

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

在实例代码中。我将其更改为:

MultiPartUpload = require('know-mpu');

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

MultiPartUpload = sinon.spy();

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

有什么比这更好的方法吗?(我不喜欢全局变量)。谢谢 :)

于 2013-09-17T08:08:45.403 回答