在sinon中使用异步回调的存根方法

问题描述 投票:1回答:2

我有一个调用parsePDF()extractText()方法,该方法在异步回调中返回其结果。

问题

我该如何编写一个测试only的测试,即parsePDF一次调用extractText,并且将path参数传递给parsePDF? (我对extractTextcleanUp有单独的单元测试。)

parsePDF方法的基本结构:

Parser.parsePDF(path, callback) {
  Parser.extractText(path, function gotResult(err, raw_text) {
    if (err) {
      callback(err)
      return;
    }
    var clean_text = Parser.cleanUp(raw_text)
    callback(null, clean_text);
  });
};

我尝试过的

尽管阅读了Sinon documentation on callsArgMocha/Chai/Sinon tutorials和诸如this one about stubbing function with callback - causing test method to timeout之类的各种SO帖子,但我仍然没有抱怨编写适当的测试所需的内容。

此尝试失败,并显示消息

错误:超时超过2000毫秒。确保此测试中调用了done()回调。

这很有意义,没有触发回调

    it('should call extractText() with path argument', function(done) {
        sandbox.stub(Parser, 'extractText')
        Parser.parsePDF('a known path', function(err, bill) {
            expect(sinon).calledOnce(Parser.extractText).calledWith('a known path')
            done()
        });
    });

但是对yeilds()的以下操作也失败,并且消息undefined is not a function指向expect...行:

    it('should call extractText() with path argument', function(done) {
        sandbox.stub(UtilityBillParser, 'extractText').yields(null, 'some text')
        Parser.parsePDF('a known path', function(err, bill) {
            expect(sinon).calledOnce(Parser.extractText).calledWith('a known path')
            done()
        });
    });

[.callsArg(1)的以下操作也一样:

    it('should call extractText() with path argument', function(done) {
        sandbox.stub(UtilityBillParser, 'extractText').callsArg(1)
        UtilityBillParser.parsePDF('a known path', function(err, bill) {
            expect(sinon).calledOnce(UtilityBillParser.extractText).calledWith('a known path')
            done()
        });
    });
javascript node.js asynchronous mocha sinon
2个回答
1
投票

由于您完全对extractText()方法进行了处理,因此永远不会调用其回调,因此不需要与回调相关的任何特殊处理。以下作品:

    it('should call extractText() with path argument', function() {
        sandbox.stub(Parser, 'extractText')
        Parser.parsePDF('a known path', 'ignored');
        sinon.assert.calledOnce(Parser.extractText)
        sinon.assert.calledWith(Parser.extractText, 'a known path', sinon.match.func)
    });

在第二个断言中使用sinon.match.func反映了以下事实:parsePDF创建其自己的匿名函数以传递给extractText;最好的办法是断言some函数已传递给extractText


0
投票

这里是单元测试解决方案:

parser.js

const Parser = {
  parsePDF(path, callback) {
    Parser.extractText(path, function gotResult(err, raw_text) {
      if (err) {
        callback(err);
        return;
      }
      var clean_text = Parser.cleanUp(raw_text);
      callback(null, clean_text);
    });
  },
  extractText(path, callback) {
    callback();
  },
  cleanUp(rawText) {
    return "real clean text";
  },
};

module.exports = Parser;

parser.test.js

const Parser = require("./parser");
const sinon = require("sinon");

describe("Parser", () => {
  afterEach(() => {
    sinon.restore();
  });
  describe("#parsePDF", () => {
    it("should clean up raw test", () => {
      const callback = sinon.stub();
      sinon.stub(Parser, "extractText").yields(null, "fake raw text");
      sinon.stub(Parser, "cleanUp").returns("fake clean text");
      Parser.parsePDF("./somepath", callback);
      sinon.assert.calledWith(Parser.extractText, "./somepath", sinon.match.func);
      sinon.assert.calledWith(Parser.cleanUp, "fake raw text");
      sinon.assert.calledWith(callback, null, "fake clean text");
    });

    it("should handle err", () => {
      const callback = sinon.stub();
      const mError = new Error("some error");
      sinon.stub(Parser, "extractText").yields(mError, null);
      sinon.stub(Parser, "cleanUp").returns("fake clean text");
      Parser.parsePDF("./somepath", callback);
      sinon.assert.calledWith(Parser.extractText, "./somepath", sinon.match.func);
      sinon.assert.calledWith(callback, mError);
    });
  });
});

带有覆盖率报告的单元测试结果:

  Parser
    #parsePDF
      ✓ should clean up raw test
      ✓ should handle err


  2 passing (9ms)

----------------|----------|----------|----------|----------|-------------------|
File            |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
----------------|----------|----------|----------|----------|-------------------|
All files       |    93.75 |      100 |    77.78 |    93.75 |                   |
 parser.js      |       80 |      100 |       50 |       80 |             13,16 |
 parser.test.js |      100 |      100 |      100 |      100 |                   |
----------------|----------|----------|----------|----------|-------------------|

源代码:https://github.com/mrdulin/mocha-chai-sinon-codelab/tree/master/src/stackoverflow/30163720

© www.soinside.com 2019 - 2024. All rights reserved.