Reputation: 2212
I'm having difficulties in testing an api call and returning an error
" HttpErrorResponse: Http failure response for https://server.herokuapp.com/twitter/gettweets: 0"
I can get it to return correct results fine
I'm basically getting tweets and displaying within the app
The service I'm testing:
const TWITTER_KEY = makeStateKey('twitter');
@Injectable()
export class SocialService {
private twitter:any;
private url = 'https://server.herokuapp.com/';
constructor(private http: HttpClient,
@Inject(PLATFORM_ID) private platformId,
private transferState:TransferState) { }
initTwitter(){
this.twitter = this.transferState.get(TWITTER_KEY, null as any);
let data;
if (this.twitter) {
data = this.transferState.get(TWITTER_KEY, null);
console.log("data= "+data);
this.transferState.remove(TWITTER_KEY);
return Observable.of(data);
}else{
const httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'application/json',
})
};
return this.http.get(this.url+'twitter/gettweets', httpOptions)
.map((response) => {
let data = response;
if (isPlatformServer(this.platformId)) {
this.transferState.set(TWITTER_KEY, data as any);
}
return data;
})
.catch((error) => Observable.throw(error) )
}
}
}
And the test the first tests are fine, but as soon as it hits the test for the error 'should return error if cannot get Tweets' I get the above error:
import { TestBed } from '@angular/core/testing';
import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing';
import { BrowserTransferStateModule } from '@angular/platform-browser';
import { SocialService } from './social.service';
describe('SocialService', () => {
let httpMock: HttpTestingController;
let service:SocialService;
let apiURL:string
let returnedResults:any
beforeEach(() => {
TestBed.configureTestingModule({
providers: [SocialService],
imports:[BrowserTransferStateModule, HttpClientTestingModule]
});
service = TestBed.get(SocialService);
httpMock = TestBed.get(HttpTestingController);
apiURL = 'https://server.herokuapp.com/';
returnedResults = [{created_at: "Jul 16 2018", id: 1, id_str: "1", text: "Twitter text1"}, {created_at: "Jul 17 2018", id: 2, id_str: "2", text: "Twitter text2"}]
});
it('should be created', () => {
expect(service).toBeTruthy();
});
it('should get Tweets', () => {
service.initTwitter()
.subscribe((response)=>{
expect(response).toBeDefined();
expect(response).toEqual(returnedResults);
console.log(response)
})
const request = httpMock.expectOne(apiURL+'twitter/gettweets');
expect(request.request.method).toEqual('GET');
request.flush(returnedResults);
httpMock.verify();
});
it('should return error if cannot get Tweets', () => {
service.initTwitter()
.subscribe((response)=>{
expect(response).toBeDefined();
expect(response.failure.error.type).toBe('ERROR_GETTING_TWEETS');
})
const request = httpMock.expectOne(apiURL+'twitter/gettweets');
request.error(new ErrorEvent('ERROR_GETTING_TWEETS'));
httpMock.verify();
});
});
Upvotes: 2
Views: 6638
Reputation: 2212
Thanks to @jonrsharpe, here's what I'm doing now
it('should return error if cannot get Tweets', () => {
service.initTwitter()
.subscribe(()=>{
}, error =>{
expect(error.error.type).toBe('ERROR_GETTING_TWEETS');
console.log(error.error.type)
Observable.throw(error)
}
)
const request = httpMock.expectOne(apiURL+'twitter/gettweets');
request.error(new ErrorEvent('ERROR_GETTING_TWEETS'));
httpMock.verify();
});
Upvotes: 5