【问题标题】:How do I expect a function to be called with specific args with sinon, mocha, and chai in nodejs?我如何期望在 nodejs 中使用带有 sinon、mocha 和 chai 的特定参数调用函数?
【发布时间】:2016-03-18 15:44:47
【问题描述】:

我在尝试确保使用传入的 args 调用 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 应该使用 args 调用: AssertionError: 预期 { Spy } 已使用 [ Array(3) ] 调用

【问题讨论】:

    标签: node.js mocha.js sinon chai sinon-chai


    【解决方案1】:

    试试这个:

    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);
      });
    }
    

    特别注意你应该从你的初始化函数中返回一个promise。然后在测试中:

    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 它是异步测试的方式。

    【讨论】:

    • 查看mochajs.org 在使用承诺以替代使用“完成”的部分下。
    • 看起来我越来越近了,非常感谢。现在我收到了这个错误。错误:超过 2000 毫秒的超时。确保在此测试中调用了 done() 回调。
    • 这个位是错误的:Q.resolve(file)。也许试试 Q.defer().resolve()
    • Mike 多亏了你,我终于可以让它工作了。对此,我真的非常感激!这是最后的测试。
    【解决方案2】:

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

    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();
        });
      });
    });
    

    【讨论】:

      【解决方案3】:

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

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

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

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

      如果你不清楚你的论点你可以吗

      sinon.match.any
      

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

      【讨论】:

      • 这个答案具体补充了什么,a)在你之前几年已经发布的早期答案中没有涵盖,b)是 OP 提出的问题提出的问题?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-08
      • 2015-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多