我有以下代码来测试使用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进行通信。
答案 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();
});