How to test if my method throws an observable error in angular2?
angular, angular2-testing, jasmine, javascript
Solution
The thing about `Observable.throw` is that it doesn't actually throw any error. Even if it did, it would be handled internally. `expect().toThrowError` only catches exceptions that aren't handle and that bubble up to the test.
What `Observable.throw` does instead is pass the error to the `onError` callback. So what you should do instead is subscribe the call, and check the error in the callback
it('..', async(() => {
app.onSubmit().subscribe(
() => {
fail('expected error');
},
(error) => {
expect(error).toBe('user already exist in database');
});
}))
Problem
I am creating unit-testcases for my angular2 components. so far test cases are running correctly. but I am facing issues regarding my asynchronous calls. For ex. I have following method for creating new user which throws an error if user is already present : ``` onSubmit():Observable<any> { this._userService.saveUser(this.user).subscribe( (response) => { this._directoryService.getDirectoryById(this.selectedDirectory._id).subscribe( (directory) => { this.users = directory[0].users; }, (error) => { return error; } ); }, (error) => { return error; } ); return ; } ``` In my service , I have am throwing an error using following: ``` if (alreadyExist) { let error = "user already exist in database"; return Observable.throw(error); } ``` Now I am expecting this method to throw an error: ``` expect( function(){ app.onSubmit(); } ) .toThrow(new Error("User already exist in database")); ``` Now from my understanding , this test case should be successful , but I am getting below error after my test case fails: Expected function to throw an exception. I tried multiple expect blocks: ``` expect(app.onSubmit()).toThrowError(new Error("User already exist in database")); ``` but still not getting any success. any inputs? thanks