3

我一直在尝试确保Q.ninvoke使用传入的 args 进行调用时遇到问题。我是使用 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)Upl​​oadCommand .initialize 当文件被成功读取时 Q.ninvoke 应该用 args 调用: 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”函数,并且在该函数的主体中,您的应用程序代码的其余部分应该去。此外,“完成”回调是您告诉 mocha 它是异步测试的方式。

于 2015-12-12T23:47:55.063 回答
1

迈克,多亏了你,我终于可以让它工作了。对此,我真的非常感激!这是最后的测试。

describe.only('when a file is read successfully', function() {
  beforeEach(function() {
    sinon.stub(Q, 'nfcall').withArgs(fs.readFile, fileParams.path).returns(Q.resolve(file));
    sinon.stub(Q, 'ninvoke').withArgs(S3, 'upload', params).returns(Q.resolve('url'));
    chai.spy.on(Q, 'ninvoke')
  });

  it('Q.ninvoke should be called with args', function(done) {
    UploadCommand.initialize(fileParams).then(function(data) {
       expect(Q.ninvoke).to.have.been.called.with(S3, 'upload', params);
       done();
    });
  });
});
于 2015-12-13T22:15:08.893 回答
0

您可以使用 sinon 来存根,如下所示

let yourFunctionStub
yourFunctionStub= sinon.stub(yourClass, "yourFunction");
                    yourFunctionStub.withArgs(arg1, arg2, arg3).returns(resultYouWant);

如果这是你可以回报的承诺

....returns(Promise.resolve(resultYouWant));

如果你不清楚你可以

sinon.match.any

希望这对您有所帮助。:)

于 2017-08-23T07:54:00.070 回答