【问题标题】:How to avoid deep nesting in nodejs tests?如何避免 nodejs 测试中的深度嵌套?
【发布时间】:2013-12-01 18:47:46
【问题描述】:

您介意分享您在测试 nodejs 方面的最佳实践吗?

为了避免深度嵌套,您有什么经验?在编写测试时无法弄清楚如何将此代码重构为闭包。

describe('ProcessRawData', function(){
  describe('event that has been already handled', function(){
    beforeEach(function(done){
      store.testMode(true);
      var filename = __dirname + '/data/test.txt';
      fs.readFile(filename, 'utf8', function(err, rawData) {
        prd.process(rawData, function(err, data){
        var rawMsgSha1 = '123464fbcb34c333f4300a88f019f43e7de757d6'; 
        store.sismember('events:handled', rawMsgSha1, function(err, exists){
          if (err) throw err;
          assert.ok(exists);
          done();
      });
    });
  });
})

【问题讨论】:

  • 你必须到处写if (err),它不会自动传播

标签: javascript node.js closures mocha.js


【解决方案1】:

您可以考虑使用像 step 这样的异步流控制库,这会使您的代码看起来像这样(未经测试):

describe('ProcessRawData', function(){
  describe('event that has been already handled', function(){
    beforeEach(function(done){
      store.testMode(true);
      var filename = __dirname + '/data/test.txt';

      Step(
        function readFile() {
          fs.readFile(filename, 'utf8', this);
        },
        function processRawData(err, rawData) {
          if (err) throw err;
          prd.process(rawData, this);
        },
        function doMoreProcessing(err, data) {
          if (err) throw err;
          var rawMsgSha1 = '123464fbcb34c333f4300a88f019f43e7de757d6';
          store.sismember('events:handled', rawMsgSha1, this);
        },
        function checkIfExists(err, exists) {
          if (err) throw err;
          assert.ok(exists);
          done();
        }
      );
    });
  });
})

【讨论】:

    猜你喜欢
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 2015-05-07
    • 2020-11-06
    • 2014-09-26
    • 1970-01-01
    • 2019-02-09
    • 1970-01-01
    相关资源
    最近更新 更多