2016-10-26 2 views
1

Я изучаю тестирование Angular 2 с кармой и задавался вопросом о некоторых моментах кода, которые я не понимал. После того, как «фиктивный модуль» TestBed настроен, следующий код работает:mockBackend = getTestBed(). Get (MockBackend) ;?

mockBackend = getTestBed().get(MockBackend); 

Что это делать? В следующей статье я нашел следующее объяснение: «получает ссылку на фальшивый бэкэнд, поэтому мы можем отвечать фальшивыми данными, когда он извлекается с помощью Http.get», но я не понимаю, почему мне нужно «получить его», isn 't это уже там из импорта {MockBackend, MockConnection} from '@angular/http/testing';? Или модуль каким-то образом получает метод?

Я использую его позже, как так ... и до сих пор не понимает, почему я должен был прикрепить его к испытательному стенду:

mockBackend.connections.subscribe(
     (connection: MockConnection) => { 
      connection.mockRespond(new Response(
       new ResponseOptions({ 
         body: "lol data" 
        } 
       ))); 
     }); 

Короче говоря, реальный вопрос - то, что делает первую строку кода, который я опубликовал?

Полный код, только для связи:

import { TestBed, getTestBed, async, inject } from '@angular/core/testing'; 
import { Headers, BaseRequestOptions, Response, HttpModule, Http, XHRBackend, RequestMethod} from '@angular/http'; 

import {ResponseOptions} from '@angular/http'; 
import {MockBackend, MockConnection} from '@angular/http/testing'; 
import {FooHttpService} from '../../services/foo-service.service.ts'; 


describe('My Service Making an Http Call',() => { 

    let mockBackend: MockBackend; 

    beforeEach(async(() => { 
     TestBed.configureTestingModule({ 
      providers: [ 
       FooHttpService, 
       MockBackend, 
       BaseRequestOptions, 
       { 
        provide: Http, 
        deps: [MockBackend, BaseRequestOptions], 
        useFactory: 
         (backend: XHRBackend, defaultOptions: BaseRequestOptions) => { 
          return new Http(backend, defaultOptions); 
         } 
       } 
      ], 
      imports: [ 
       HttpModule 
      ] 
     }); 

     mockBackend = getTestBed().get(MockBackend); 
     TestBed.compileComponents(); 
    })); 

Код взят из tutorial here.

ответ

2

не так уже есть от import {MockBackend, MockConnection} from '@angular/http'

Это только даст вам доступ к символу/класса. Так же, как, если вы хотите использовать службу в компоненте, вам необходимо импортировать службу в компонент файла

import { SomeService } from './some.service' 

class SomeComponent { 
    constructor(service: SomeService) {} 
} 

Если мы не импортируем SomeService, мы получим ошибку «не может найти символ SomeService ». Но это всего лишь время компиляции. Этого недостаточно, чтобы использовать экземпляр службы как время выполнения. Если бы это было все, что у нас было, во время выполнения мы получили бы ошибку «нет провайдера для SomeService». Нам все еще нужно добавить, если к providers так, что Угловая знает, чтобы создать его, и передать экземпляр компонента во время выполнения

import { NgModule } from '@angular/core'; 
import { SomeService } from './some.service'; 
import { SomeComponent } from './some.component'; 

@NgModule({ 
    declarations: [ SomeComponent ], 
    providers: [ SomeService ] 
}) 
class SomeModule {} 

Здесь то же самое, нам нужно импортировать компонент символа/класса в чтобы мы могли использовать символ/класс в этом файле.

Что касается MockBackend, вы добавляете класс к поставщикам

providers: [ MockBackend ] 

Это говорит Угловым для создания экземпляра, что позволяет ему быть инъекционным. Затем впрыскивает экземпляр, созданный угловой, в фабричном метод

useFactory: (backend: MockBackend, options: BaseRequestOptions) => { 
    return new Http(backend, options); 
} 

Http Теперь будет использовать этот экземпляр MockBackend, когда мы делаем запросы. Но нам нужен доступ к тому же экземпляру, чтобы мы могли издеваться над ответом. Чтобы получить его, нам нужно получить его от Углового инжектора (который является контейнером для всех поставщиков).Чтобы получить доступ к форсунке во время испытания, мы можем пройти через TestBed, который действует как инжектор для тестовой среды

mockBackend = TestBed.get(MockBackend); 

Здесь мы просим Угловыми смотреть в инжекторе для поставщика MockBackend. Это будет тот же самый экземпляр, который вводится в функцию useFactory. Поэтому мы гарантируем, что мы издеваемся над ответами на том же экземпляре MockBackend, который использует Http.

Смежные вопросы