用茉莉花测试错误和承诺

时间:2021-02-23 13:11:58

标签: javascript asynchronous async-await promise jasmine

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

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":{}}.

我是否遗漏了一些明显的东西?

2 个答案:

答案 0 :(得分:0)

我认为你的说法是不正确的。您在嘲笑 doSomething 会抛出 new 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, {}));

答案 1 :(得分:0)

async 函数将它们的所有内容都包装在一个承诺中,因此即使在遇到任何“等待”之前抛出错误,所发生的情况也是承诺拒绝而不是抛出错误。以下测试通过:

  it('test test', (done) => {
    const error = new Error('something went wrong');
    component.myUtilityMethod = sinon.stub().throws(error);

    component.doSomething().catch((e) => {
      expect(e).toEqual(jasmine.any(MyError));
      done();
    });
  });