【发布时间】:2018-07-20 20:53:15
【问题描述】:
我在测试 api 调用并返回错误时遇到困难
" HttpErrorResponse: https://server.herokuapp.com/twitter/gettweets 的 Http 失败响应:0"
我可以让它返回正确的结果
我基本上是在应用中获取推文并显示
我正在测试的服务:
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) )
}
}
}
并且测试第一个测试很好,但是一旦它遇到错误的测试 '如果无法获取推文,则应返回错误' 我收到上述错误:
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();
});
});
【问题讨论】:
-
如果你在 observable 中抛出一个错误,最终在 second 回调中订阅。
-
非常感谢,它起作用了,我已经发布了,我如何更改答案中的代码,但是如果您想将您的评论作为答案发布,我会将其标记为正确
标签: angular unit-testing jasmine