【问题标题】:Testing errors and promises with jasmine用茉莉花测试错误和承诺
【发布时间】:2021-05-25 18:20:18
【问题描述】:

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

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

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

【问题讨论】:

    标签: javascript asynchronous async-await promise jasmine


    【解决方案1】:

    我认为你的断言是不正确的。您在嘲笑 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, {}));
    

    【讨论】:

    • 你说的很对,我写的问题是错的。然而,它仍然存在。
    • 检查您的错误并查看expectedactual。查看我的编辑。我想就是这样。
    • 我发现问题出在哪里。 async 函数将其所有内容包装在一个承诺中。所以为了测试我想要做的事情,我需要使用 promise.catch。
    【解决方案2】:

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

      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();
        });
      });
    

    【讨论】:

      猜你喜欢
      • 2023-03-27
      • 1970-01-01
      • 2016-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多