3

渡す引数で が呼び出されることを確認しようとして問題が発生しQ.ninvokeました。Sinon、Mocha、Chai でテストするのは初めてです。オンラインで見つけたすべてを 2 日間試しましたが、まだテスト パスを取得できません。私は何を間違っていますか?

これはテスト中の私のコードです。

var cuid = require('cuid');
var fs = require('fs');
var Q = require('q');
var AWS = require('aws-sdk');
var S3 = new AWS.S3();

module.exports = {
  initialize: initialize
};

function initialize(options) {
  return Q.nfcall(fs.readFile, options.path).then(function (file) {
    var fileParams = {
      Bucket: options.bucket,
      Key: options.name,
      Body: file,
      ContentType: options.contentType
    };

    return Q.ninvoke(S3, 'upload', fileParams).then(function(data){
      return data.Location;
    });
  });
}

これが私のテストです。

describe.only('when a file is read successfully', function() {
    var spy;

    beforeEach(function() {
        spy = chai.spy.on(Q, 'ninvoke');
        sinon.stub(Q, 'nfcall').withArgs(fs.readFile, fileParams.path).returns(Q.resolve(file));
    });

    it('Q.ninvoke should be called with args', function() {
        UploadCommand.initialize(fileParams)
        expect(spy).to.have.been.called.with(S3, 'upload', params);
    });
});

これは私が得ているエラーです。

1) UploadCommand .initialize ファイルが正常に読み取られた場合 Q.ninvoke は引数で呼び出される必要があります: AssertionError: expected { Spy } to have been called with [ Array(3) ]

4

3 に答える 3

4

これを試して:

var cuid = require('cuid');
var fs = require('fs');
var Q = require('q');
var AWS = require('aws-sdk');
var S3 = new AWS.S3();

module.exports = {
  initialize: initialize
};

function initialize(options) {
   return Q.nfcall(fs.readFile, options.path).then(function (file) {
    var fileParams = {
       Bucket: options.bucket,
       Key: options.name,
       Body: file,
       ContentType: options.contentType
    };

    return Q.ninvoke(S3, 'upload', fileParams);
  });
}

特に、初期化関数からプロミスを返す必要があることに注意してください。次に、テストで:

describe.only('when a file is read successfully', function() {
      var spy;

      beforeEach(function() {
      spy = chai.spy.on(Q, 'ninvoke');
      sinon.stub(Q, 'nfcall').withArgs(fs.readFile,fileParams.path).returns(Q.resolve(file));
   });

  it('Q.ninvoke should be called with args', function(done) {
    UploadCommand.initialize(fileParams).then(function(data) {
       expect(spy).to.have.been.called.with(S3, 'upload', params);
       done();
    });
  });
});

他にも注意すべき点がいくつかあります。メイン アプリケーション コードでは、初期化関数を「then」関数にチェーンすることもできます。その then 関数の本体では、アプリケーション コードの残りの部分を配置する必要があります。また、「完了」コールバックは、モカに非同期テストであることを伝える方法です。

于 2015-12-12T23:47:55.063 に答える