【问题标题】:How can I test this Angular 2 service?如何测试这个 Angular 2 服务?
【发布时间】:2016-07-20 14:16:13
【问题描述】:

我的 Angular 应用程序中有以下服务:

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

@Injectable()
export class BookService {

  constructor(private http: Http) {}

  getList() {
    return this.http.get('/api/books.json');
  }
}

如何测试getList() 函数?

我不需要每一个细节,只需要一些大方向。我认为这是相当陈旧的领域,但我很难找到关于人们通常如何进行此类测试的文档。一旦我知道了前进的方向,我可能可以自己追查细节。

【问题讨论】:

    标签: testing typescript angular


    【解决方案1】:
    import {addProviders, inject} from '@angular/core/testing';
    
    describe('my code', () => {
      beforeEach(() => {
        addProviders([
          BookService, 
          HTTP_PROVIDERS,
          MockBackend,
          {provide: XHRBackend, useExiting: MockBackend}]);
      });
    
      it('does stuff', inject([BookService], (service) => {
        // actual test
      });
    });
    

    更多详情见https://angular.io/docs/ts/latest/api/http/testing/MockBackend-class.html

    【讨论】:

    • 感谢您的回答。我认为这有助于阐明这个主题,尽管我对it内部 的内容更感兴趣:)。我创建了一个单独的问题来描述我目前正在尝试的内容。也许一旦解决了这个问题,我们就可以将解决方案拼接到这个答案中。 stackoverflow.com/questions/38484765/…
    【解决方案2】:

    我自己又搞砸了一些。以下是我为测试本身提出的建议:

      it('should assign a list of books', inject([BookService, MockBackend, Http], (bookService, backend, http) => {
        backend.connections.subscribe(connection => {
          var mockResponse = new Response(new ResponseOptions({
            body: [{ name: 'Whiteboard Interviews' }]
          }));
          connection.mockRespond(mockResponse);
        });
    
        let service = new BookService(http);
        service.getList().subscribe(response => {
          expect(response.json()).toEqual([{ name: 'Whiteboard Interviews' }]);
        });
      }));
    

    这是完整的规范文件:

    /* tslint:disable:no-unused-variable */
    
    import { provide } from '@angular/core';
    import { MockBackend } from '@angular/http/testing';
    
    import {
      Http,
      HTTP_PROVIDERS,
      Response,
      ResponseOptions,
      BaseRequestOptions,
      ConnectionBackend
    } from '@angular/http';
    
    import {
      beforeEach, beforeEachProviders,
      describe, xdescribe,
      expect, it, xit,
      async, inject
    } from '@angular/core/testing';
    
    import { BookService } from './book.service';
    
    describe('Book Service', () => {
      beforeEachProviders(() => [
        BookService,
        HTTP_PROVIDERS,
        MockBackend,
        BaseRequestOptions,
        provide(Http, {
          useFactory: function (backend:ConnectionBackend, defaultOptions:BaseRequestOptions) {
            return new Http(backend, defaultOptions);
          },
          deps: [MockBackend, BaseRequestOptions]
        })
      ]);
    
      it('should ...',
          inject([BookService], (service: BookService) => {
        expect(service).toBeTruthy();
      }));
    
      it('should assign a list of books', inject([BookService, MockBackend, Http], (bookService, backend, http) => {
        backend.connections.subscribe(connection => {
          var mockResponse = new Response(new ResponseOptions({
            body: [{ name: 'Whiteboard Interviews' }]
          }));
          connection.mockRespond(mockResponse);
        });
    
        let service = new BookService(http);
        service.getList().subscribe(response => {
          expect(response.json()).toEqual([{ name: 'Whiteboard Interviews' }]);
        });
      }));
    });
    

    【讨论】:

      猜你喜欢
      • 2017-06-03
      • 2017-09-25
      • 2016-11-25
      • 1970-01-01
      • 2017-12-20
      • 1970-01-01
      • 1970-01-01
      • 2018-09-28
      • 2022-01-21
      相关资源
      最近更新 更多