2017-09-01 52 views
0

鉴于返回什么和实现可能抛出.subscribe()处理的Angular2 /打字稿法,比如这个:如何期待在Jasmine/Angular2/Typescript中异步抛出的异常?

onSubmit() { // returns nothing 
    this.service.someCall(this.someData).subscribe(
    data => { 
     return Promise.reject('This is an asynchronously thrown error.'); 
    }, 
    err => {}, 
); 
} 

(就目前而言,我们假设有这样做的一个很好的理由.subscribe()处理程序到(可能有条件地)拒绝没有其他可测试的副作用,因此只会导致错误消息冒泡到应用程序的顶部)。

如何测试此方法导致一个被拒绝的承诺?

我发现一些人有同样的问题,但没有答案优雅:

How to deal with thrown errors in async code with Jasmine?

https://github.com/jasmine/jasmine/issues/529

https://gist.github.com/badsyntax/7769526

+1

很难确切地知道如何在这里做出好的答案。这可能是一种情况,难以编写好的测试表明代码的重构是有序的。例如,为什么可观察的抛出承诺被拒绝,而不是抛出一个你会在'err => {}'中捕获的错误。在这种情况下'onSubmit'应该做什么。最后一个问题的答案是你应该测试的。谁在回复Promise,回调代码或可观察代码。为什么不在onSubmit的任何地方处理? –

回答

0

我通过捻熄console.error解决了这个问题()方法(在这种情况下,我正在使用Sinon):

it('should throw exception from component on submit', (done) => { 
    // Jasmine isn't capable of capturing an exception thrown from an *asynchronous* operation. 
    // However, that error eventually finds its way to console.error(), so we can stub 
    // that method and wait for it to be called. 
    sandbox.stub(console, 'error').callsFake((...err) => { 
    expect(err[1]).toEqual('This is an asynchronously thrown error.'); 
    done(); 
    }); 
    component.onSubmit(); 
}); 

有没有其他更好的方法可以解决这个问题?

+1

你需要小心,你没有测试你的测试框架。当我运行这个时,我得到摩卡关于未处理诺言的控制台错误,这不是我想测试的。如果'onSubmit'应该记录一个错误,函数中应该有代码来做这件事。 –