单元测试 – angular2 – 如何在http.post单元测试中模拟错误

我正在使用HTTP.post调用登录方法编写Uni-test,如:
this.http.post( endpoint,creds,{ headers: headers})
        .map(res => res.json())
        .subscribe(
        data => this.onLoginComplete(data.access_token,credentials),err => this.onHttpLoginFailed(err),() => this.trace.debug(this.componentName,"Login completed.")
    );

问题是我无法模拟错误分支;每次都被称为onLoginComplete方法;

这是我的测试:

it("check that  Atfer Login,console show an error ",inject(
  [TraceService,Http,MockBackend,WsiEndpointService],(traceService: TraceService,http: Http,backend: MockBackend,wsiEndpoint: WsiEndpointService) => {

  let tokenTest: number =  404 ;

  let response: ResponSEOptions = null {} // i think i have to modify this

  let connection: any;

  backend.connections.subscribe((c: any) => connection = c);

  let authService: AuthService = new AuthService(http,Service1,Service2);

  authenticationservice.login({ "username": "a","password": "1" });

  connection.mockRespond(new Response(response));

  expect(ERROR);

}));

再次感谢大家.

首先,您需要通过MockBackend覆盖XHRBackend类:
describe('HttpService Tests',() => {
  beforeEachProviders(() => {
    return [
      HTTP_PROVIDERS,provide(XHRBackend,{ useClass: MockBackend }),HttpService
    ];
  });

  (...)
});

请注意,HttpService是使用Http对象的服务,我想测试.

然后你需要注入mockBackend并订阅其connections属性.发送请求时,将调用相应的回调,您可以指定响应元素,如正文.该服务将接收此响应作为呼叫的响应.因此,您将能够基于此测试您的服务方法.

下面我将介绍如何测试HttpService的getItems方法

it('Should return a list of items',inject([XHRBackend,HttpService,Injector],(mockBackend,httpService,injector) => {
  mockBackend.connections.subscribe(
    (connection: MockConnection) => {
      connection.mockRespond(new Response(
        new ResponSEOptions({
          body: [ { id: '1',label: 'item1' }]
        })));
      });

  httpService.getItems().subscribe(
    items => {
      expect(items).toEqual([ { id: '1',label: 'item1' }]);
    });
  });
});

这是HttpService的getItems方法代码

@Injectable()
export class HttpService {
  constructor(private http:Http) {
  }

  getItems(): Observable<any[]> {
    return this.http.get('/items').map(res => res.json());
  }
}

要模拟错误,只需使用mockerror方法而不是mockResponSEOne:

mockBackend.connections.subscribe(
    (connection: MockConnection) => {
      connection.mockerror(new Error('some error'));
    });

相关文章

ANGULAR.JS:NG-SELECTANDNG-OPTIONSPS:其实看英文文档比看中...
AngularJS中使用Chart.js制折线图与饼图实例  Chart.js 是...
IE浏览器兼容性后续前言 继续尝试解决IE浏览器兼容性问题,...
Angular实现下拉菜单多选写这篇文章时,引用文章地址如下:h...
在AngularJS应用中集成科大讯飞语音输入功能前言 根据项目...
Angular数据更新不及时问题探讨前言 在修复控制角标正确变...