【问题标题】:Monitoring of a library with sinon使用 sinon 监控库
【发布时间】:2013-09-20 21:01:53
【问题描述】:

我有以下代码要使用 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 进行通信。

【问题讨论】:

  • 对不起,我已经编辑了要回答的问题:)

标签: javascript node.js tdd mocha.js sinon


【解决方案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();
});

【讨论】:

  • 感谢您的回答!但它不起作用,它回答:“预期存根至少被调用过一次,但它从未被调用过”还有其他想法吗? :)
【解决方案2】:

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

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

在实例代码中。我把它改成:

MultiPartUpload = require('know-mpu');

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

MultiPartUpload = sinon.spy();

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

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

【讨论】:

    【解决方案3】:

    您是否研究过类似 https://github.com/felixge/node-sandboxed-module 的内容?当您需要 instance 模块时,您可以使用 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();
    });
    

    【讨论】:

    • 嗯,你会如何使用它?我从未使用过它,但是使用例如 README 中给出的代码,我看到 mysql 是假的,但是您如何监视它以查看是否已被调用?
    猜你喜欢
    • 2018-08-19
    • 1970-01-01
    • 2020-05-23
    • 2019-06-28
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    • 2017-12-20
    • 2015-06-30
    相关资源
    最近更新 更多