【问题标题】:Intern: Testing async unit tests with ES6 promises实习生:使用 ES6 Promise 测试异步单元测试
【发布时间】:2016-11-22 00:21:33
【问题描述】:

我有一些异步函数需要通过 Intern 进行测试。每个都使用 ES6 承诺。

在 Intern 文档中,它说返回 promise 的测试函数会在该 promise 得到解决后立即通过。但是,我不仅关心我正在测试的异步函数是否被解析/拒绝,我还想检查以确保解析的值是正确的。

例子:我有我的功能:

function getSomething() {
  return new Promise((resolve, reject) => {
    // do some async stuff and resolve when done
    setTimeout(function() {
      resolve('the value');    
    }, 1000);

  });
}

那我就有测试方法了:

tdd.test('getSomething', function() {
  return new Promise((resolve, reject) => {
    getSomething().then(function(value) {
      // I want to resolve/reject the promise BASED ON the assertion -- if the assertion fails, I want to reject the promise; if it succeeds, I want to resolve it
      assert.equal(value, 'the value', 'getSomething should return "the value".');
      resolve();
    });
  });
}

我注意到这不起作用——如果断言在我的测试中失败,resolve() 永远不会被调用。

我如何能够解决/拒绝以断言为条件的承诺?我应该将断言包装在 try/catch 中吗?我没有在 Intern 文档上看到任何关于此的文档(大多数使用 this.async() 而不是 ES6 承诺)。

【问题讨论】:

    标签: intern


    【解决方案1】:

    您的代码中发生的情况是getSomething 回调中的断言引发了异常,这阻止了resolve 被调用。 getSomething 承诺将被拒绝,但由于您没有在包装承诺的初始化程序中返回它,因此包装承诺永远不会被解决或拒绝。

    无需将getSomething 返回的承诺包装在新的承诺中。直接退货就好了。

    【讨论】:

    • 所以测试只是return getSomething.then(function(){ assert('whatever') })?是否会调用断言,因为在这种情况下,promise 已经被解决了?
    • 是的(getSomething().then -- 不要忘记括号)。断言将在getSomething() 承诺解决后被调用。这很好,因为您返回的东西实际上是一个承诺链,并且该链在 then 回调(以及断言)执行之前不会解析。 (如果 getSomething 承诺被拒绝,它也可以拒绝,但这也没关系。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-27
    • 1970-01-01
    • 2012-07-15
    • 2017-12-16
    • 2013-03-14
    • 1970-01-01
    相关资源
    最近更新 更多