首页 > 解决方案 > 用茉莉花测试错误和承诺

问题描述

测试错误和承诺。我的情况类似于以下情况:

public myUtilityMethod(): Promise<string> {
  // some synchronous stuff
  console.log('bla bla');
  // some asynchronous stuff
  return Promise.resolve('ok');
}
public async doSomething(): Promise<void> {
  let promise;
  try {
    promise = this.myUtilityMethod();
  } catch (e) {
    throw new MyError('I knew it', e, {});
  }
  await Promise.all([promise]);
  return Promise.resolve();
}

我想测试,当myUtilityMethod的同步部分出现问题时,我会抛出一个MyError,所以我编写了以下测试

it('should throw MyError when something goes wrong in the synchronous part of myUtilityMethod', fakeAsync(() => {
  // given
  const error = new Error('something went wrong');
  component.myUtilityMethod = sinon.stub().throws(error);
  // when
 expect(() => {
   component.doSomething();
   flushMicrotasks();
 }).toThrow(jasmine.any(MyError));
}));

测试失败是因为

        Error: Expected function to throw <jasmine.any(MyError)>, but it threw Error: Uncaught (in promise): MyError: {"message":"i knew it","nativeError":{},"context":{}}.

我错过了一些明显的东西吗?

标签: javascriptasynchronousasync-awaitpromisejasmine

解决方案


我认为你的说法是不正确的。你在嘲笑它doSomethingnew Error('something went wrong')但你期待一个MyError.

我会存根myUtilityMethod扔掉Error它,然后它会进入你的catch块并被throw new MyError('I knew it', e, {})遍历。

it('should throw MyError when something goes wrong in the synchronous part of myUtilityMethod', fakeAsync(() => {
  // given
  const error = new Error('something went wrong');
  component.myUtilityMethod = sinon.stub().throws(error); // make myUtilityMethod throw the error
  // when
 expect(() => {
   component.doSomething(); // once myUtilityMethod throws the error, doSomething's catch block will run
   flushMicrotasks();
 }).toThrow(new LabelGenerationError('I knew it', error, {}));
}));

编辑:查看您的新错误后:

// change this line to back to how it was
.toThrow(jasmine.any(MyError));
// to this
.toThrow(new LabelGenerationError('I knew it', error, {}));

推荐阅读