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 ライブラリをスパイする必要があります。問題は、ライブラリが使用されているインスタンスと通信できないことです。

4

3 に答える 3

1

ドキュメントから:

指定された関数をプロトタイプとして新しいオブジェクトを作成し、実装されたすべての関数をスタブします。指定されたコンストラクター関数が呼び出されていません

これはsinon.createStubInstance(MultiPartUpload);、すべてのプロトタイプ関数をスタブとして持つ新しいスタブを返すことを意味します。関数が呼び出された場合にスパイする方法を探していると思うので、1 つの方法はスタブで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 を使用してknox-mpuの代わりにスパイを使用できます。

編集:すべてのコードを提供していないため、完全に機能する例を示すことはできません。しかし、sandboxed-module は次のように機能します。

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 に答える