Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在Promise.all()上测试catch块?_Javascript_Unit Testing_Promise_Mocha.js_Chai - Fatal编程技术网

Javascript 如何在Promise.all()上测试catch块?

Javascript 如何在Promise.all()上测试catch块?,javascript,unit-testing,promise,mocha.js,chai,Javascript,Unit Testing,Promise,Mocha.js,Chai,获取此代码: //Waiting until all records are inserted to DB Promise.all(promises).then(function(err){ context.succeed({ valid: true, succeedRecords:succeedRecords, failedRecords:failedRecords }); //Log console.log("Lambda function is finishe

获取此代码:

//Waiting until all records are inserted to DB
Promise.all(promises).then(function(err){   
    context.succeed({ valid: true, succeedRecords:succeedRecords, failedRecords:failedRecords });
    //Log
    console.log("Lambda function is finished - Successfully added records: " + succeedRecords.length + ",  Failed records: " + 
        failedRecords.length + "  -  Total processed records: " + event.Records.length);   
})
.catch(function (err) {
    if (err) {
        var msg = "Got error from Promise.all(), Error: " + err;
        console.log(msg);
        context.fail({ valid: false, message: msg });
    }
});

我需要知道如何使用
mocha
测试catch块?

假设您只想检查
是否承诺。所有
失败代码会简单得多:

//Waiting until all records are inserted to DB
return Promise.all(promises).then(function(err){   
  context.succeed({ valid: true, succeedRecords:succeedRecords, failedRecords:failedRecords });
  //Log
  console.log("Lambda function is finished - Successfully added records: " + succeedRecords.length + ",  Failed records: " + 
    failedRecords.length + "  -  Total processed records: " + event.Records.length);   
});
mocha
在这种情况下,将在返回的承诺后附加一个
catch
,如果调用,则会失败

在某些情况下,要处理错误场景,请执行一些检查,并仅在特定场景中失败:

//Waiting until all records are inserted to DB
return Promise.all(promises).then(function(err){   
  context.succeed({ valid: true, succeedRecords:succeedRecords, failedRecords:failedRecords });
  //Log
  console.log("Lambda function is finished - Successfully added records: " + succeedRecords.length + ",  Failed records: " + 
    failedRecords.length + "  -  Total processed records: " + event.Records.length);   
})
.catch(function (err) {
  var msg = "Got error from Promise.all(), Error: " + err;
  console.log(msg);
  // ... do some stuff here
  context.fail({ valid: false, message: msg });

  // add an expectation here to check if the error message is correct
  // If the error message is "this error" the test passes, otherwise it will fail
  expect(err).to.be.eql('this error');
});
详细地 我将退一步,尝试详细解释它是如何工作的。 假设你的测试承诺拒绝:

// your code
it('rejects', () => {

  return Promise.reject();

});
此测试将失败,因为
mocha
将执行以下操作(实际代码为):

因此,您返回的承诺将被链接到
。然后
.catch
,并将通过两个回调:一个用于成功(使测试通过),另一个用于错误(使测试失败)

在上述拒收案例中,发生的情况如下:

  // mocha code (I've just replaced the function call with its result)
  var result = Promise.reject();
  if(result && result.then){
    result.then(function successCase() {
      // this is not called!
      done();
    })
    .catch(function errorCase(reason) {
      // it will land here!
      done(reason);
    } );
  }
在OP问题的代码中,承诺可能会出现错误,错误将被捕获:

Promise.reject()
  .catch( function( err ){
    var msg = "Got error from Promise.all(), Error: " + err;
    console.log(msg);
    context.fail({ valid: false, message: msg });
  }); <-- what is the output here?
现在,假设您希望承诺拒绝,捕获错误,然后测试某些内容(可能是错误消息?其他选项?等等)。考虑到上面的代码,您是如何做到这一点的?简单,你以某种方式抛出了一个错误。一种方法可以是显式抛出错误,也可以使用断言(失败的断言将抛出错误)


假设您只想检查
承诺是否失败。所有
都失败代码会简单得多:

//Waiting until all records are inserted to DB
return Promise.all(promises).then(function(err){   
  context.succeed({ valid: true, succeedRecords:succeedRecords, failedRecords:failedRecords });
  //Log
  console.log("Lambda function is finished - Successfully added records: " + succeedRecords.length + ",  Failed records: " + 
    failedRecords.length + "  -  Total processed records: " + event.Records.length);   
});
mocha
在这种情况下,将在返回的承诺后附加一个
catch
,如果调用,则会失败

在某些情况下,要处理错误场景,请执行一些检查,并仅在特定场景中失败:

//Waiting until all records are inserted to DB
return Promise.all(promises).then(function(err){   
  context.succeed({ valid: true, succeedRecords:succeedRecords, failedRecords:failedRecords });
  //Log
  console.log("Lambda function is finished - Successfully added records: " + succeedRecords.length + ",  Failed records: " + 
    failedRecords.length + "  -  Total processed records: " + event.Records.length);   
})
.catch(function (err) {
  var msg = "Got error from Promise.all(), Error: " + err;
  console.log(msg);
  // ... do some stuff here
  context.fail({ valid: false, message: msg });

  // add an expectation here to check if the error message is correct
  // If the error message is "this error" the test passes, otherwise it will fail
  expect(err).to.be.eql('this error');
});
详细地 我将退一步,尝试详细解释它是如何工作的。 假设你的测试承诺拒绝:

// your code
it('rejects', () => {

  return Promise.reject();

});
此测试将失败,因为
mocha
将执行以下操作(实际代码为):

因此,您返回的承诺将被链接到
。然后
.catch
,并将通过两个回调:一个用于成功(使测试通过),另一个用于错误(使测试失败)

在上述拒收案例中,发生的情况如下:

  // mocha code (I've just replaced the function call with its result)
  var result = Promise.reject();
  if(result && result.then){
    result.then(function successCase() {
      // this is not called!
      done();
    })
    .catch(function errorCase(reason) {
      // it will land here!
      done(reason);
    } );
  }
在OP问题的代码中,承诺可能会出现错误,错误将被捕获:

Promise.reject()
  .catch( function( err ){
    var msg = "Got error from Promise.all(), Error: " + err;
    console.log(msg);
    context.fail({ valid: false, message: msg });
  }); <-- what is the output here?
现在,假设您希望承诺拒绝,捕获错误,然后测试某些内容(可能是错误消息?其他选项?等等)。考虑到上面的代码,您是如何做到这一点的?简单,你以某种方式抛出了一个错误。一种方法可以是显式抛出错误,也可以使用断言(失败的断言将抛出错误)


为了理解,您想设置
上下文.fail
出错,然后使测试失败?@MarcoL,是的,因此Promise.all()将引发错误。然后返回
Promise.all
,如下所示,不带
catch
。为了理解,你想设置
context.fail
出错,然后让测试失败吗?@MarcoL,是的,因此Promise.all()将引发错误。然后返回
Promise.all,如下所示,不带
catch
。该代码是我要测试的代码,因此
expect(err).to.be.eql('this error')不应该出现在这里。在某些情况下,您希望测试返回的错误是否正确,因此我留下了该示例。如果您在测试代码中抓住了承诺,那么您就是在吃错误,所以它不会失败。要么删除catch,要么在catch块中抛出新错误。;-)代码是我要测试的代码,所以
expect(err).to.be.eql('this error')不应该出现在这里。在某些情况下,您希望测试返回的错误是否正确,因此我留下了该示例。如果您在测试代码中抓住了承诺,那么您就是在吃错误,所以它不会失败。要么删除catch,要么在catch块中抛出新错误。;-)