【问题标题】:How to use MockBackend in Angular2如何在 Angular2 中使用 MockBackend
【发布时间】:2016-11-26 08:03:31
【问题描述】:

我有这项服务需要测试:

import { Injectable } from '@angular/core';
import { Http } from '@angular/http';

@Injectable()
export class LoginService {

  private baseUrl: string = 'http://localhost:4000/';

  constructor (private http: Http) {}

  public getBaseUrl() {
    return this.baseUrl;
  }

  getLogin() {
    return this.http.get(this.baseUrl + 'api/auth/octopus')
      .map(res => res.json().redirect);
  }
}

要测试 getLogin() 函数,我有以下代码:

import {
  async,
  describe,
  it,
  expect,
  beforeEach,
  addProviders,
  inject
} from '@angular/core/testing';
import { provide} from '@angular/core';
import { LoginService } from './login.service';
import {
  Http,
  BaseRequestOptions,
} from '@angular/http';
import {MockBackend} from '@angular/http/testing';


describe('Service: LoginService', () => {

  beforeEach(() => addProviders([
    LoginService,
    BaseRequestOptions,
    MockBackend,
    provide(Http, {
      useFactory: (backend: MockBackend, defaultOptions: BaseRequestOptions) => {
        return new Http(backend, defaultOptions);
      },
      deps: [MockBackend, BaseRequestOptions]
    })
  ]));

  it('should return data.',
    async(inject([LoginService], (loginService: LoginService) => {
      loginService.getLogin().subscribe(
        data => console.log(data)
      );
    })
  ));

});

但是,数据不会被记录。 我尝试了在 SO 或 Internet 上找到的各种解决方案。

其中一个是对 mockbackend 进行 http 调用,但这只是给了我 data = undefined。

【问题讨论】:

    标签: unit-testing http angular


    【解决方案1】:

    您需要注入 MockBackend 并订阅连接,如下所示:

    更新

    async(inject([LoginService, MockBackend], (loginService: LoginService, mockBackend:MockBackend) => {
      let mockResponse = new Response(new ResponseOptions({body: {'redirect': 'some string'}}))
      mockBackend.connections.subscribe(c => c.mockRespond(mockResponse));
      loginService.getLogin().subscribe(
        data => console.log(data)
      );
    })
    

    更多详情请看这里:

    https://angular.io/docs/ts/latest/api/http/testing/index/MockBackend-class.html

    【讨论】:

    • 这给了我:位置 0 处 JSON 中的意外标记 y
    • 好的,只需将'youData' 字符串更改为json,就像这样:{'redirect': 'some string'}
    猜你喜欢
    • 2017-01-17
    • 2016-03-13
    • 2016-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-02
    • 2016-12-12
    • 2018-01-21
    相关资源
    最近更新 更多