Mocha / Should.js使用异步函数

时间:2016-05-24 14:14:50

标签: javascript node.js testing mocha should.js

我是JavaScript测试框架的新手。我想做一点优化,但我遇到了一些问题。该项目正在使用should.js

以下是我原始测试用例的简化版本:

describe('Simple', function() {
  describe('Test', function() {
    it('should do something', function(done) {
      somePromise.then(function(data) {
        data.should.above(100);
        done();
      });
    }

    it('should do something else but alike', function(done) {
      somePromise.then(function(data) {
        data.should.above(100);
        done();
      });
    }

  }
});

我试图这样做:

var testFunc = function(data) {
  it('should do something', function(done) {
      data.should.above(100);
      done();
  });
}

describe('Simple', function() {
  describe('Test', function() {
      somePromise.then(function(data) {
        testFunc(data);
      });

      somePromise.then(function(data) {
        testFunc(data);
      });
  }
});

承诺是异步的,也许这就是我的优化"没工作?我发现没有"完成"在文档中回调describe函数。

提前致谢!任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:2)

您的示例不起作用since Mocha has finished registering test cases when your promise resolves

使用不同的断言测试相同的承诺

要使用多个断言测试单个promise,您只需在测试开始时创建promise,然后在it块中使用它,如下所示:

describe('A module', function() {
    var promise;

    before(function () {
        promise = createPromise();
    });

    it('should do something', function() {
        return promise.then(function (value) {
            value.should.be.above(100);
        });
    });

    it('should do something else', function() {
        return promise.then(function (value) {
            value.should.be.below(200);
        });
    });
});

请注意,如果从API调用返回promise,则只会调用一次。 The result is simply cached in the promise for the two test cases.

这也利用you can return promises from test cases而不是使用完成回调这一事实。如果拒绝承诺或者then()调用中的任何断言失败,则测试用例将失败。

使用相同的断言测试不同的承诺

假设您想使用相同的断言测试不同的promises,您可以将函数传递给testFunc,从而创建要测试的承诺。

var testFunc = function(promiseFactory) {
  it('should do something', function(done) {
      promiseFactory().then(function(data) {
          data.should.above(100);
          done();
      });
  });
}

describe('Simple', function() {
  describe('Test', function() {
      testFunc(function () { return createSomePromise(); });

      testFunc(function () { return createSomeOtherPromise(); });
  });
});

这是有效的,因为Mocha的it函数立即在describe块内运行。然后,在实际运行测试用例时,使用promiseFactory回调创建promise。

你也可以return promises from test cases改变testFunc以将断言作为这样的承诺返回:

var testFunc = function(promiseFactory) {
  it('should do something', function() {
      return promiseFactory().should.eventually.be.above(100);
  });
}