用茉莉花测试错误和承诺
Testing errors and promises with 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":{}}.
我是不是遗漏了什么明显的东西?
我认为你的说法是不正确的。你在嘲笑 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, {}));
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();
});
});
测试错误和承诺。我的情况类似于以下情况:
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":{}}.
我是不是遗漏了什么明显的东西?
我认为你的说法是不正确的。你在嘲笑 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, {}));
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();
});
});