2016-06-02 1 views
1

Я хочу, чтобы проверить следующие услуги, которые возвращают наблюдаемым:Невозможно `` subscribe` к Observable` для HTTP-запроса получить в файле спецификации

public getData(str:string) { 
    // return an observable 
    return this.http.get(‘calltoserviceapi’+str) 
     .map((responseData) => { 

      return responseData.json().Abc; 
     }) 
     .map((s: Array<any>) => { 
      let result:Array<AbcModel> = []; 
      if (s) { 
       s.forEach((s) => { 
        result.push(
         new AbcModel(s.Val1, 
          s.Val2, 
          )); 
       }); 
      } 
      return result; 
     }); 
} 

мой спецификации файла:

fdescribe ("my-service.spec.js",()=> { 

    beforeEachProviders(() => [ 
     MyService, 
     BaseRequestOptions, 
     MockBackend, 
     provide(Http, { 
      useFactory: (backend: MockBackend, defaultOptions: BaseRequestOptions) => { 
       return new Http(backend, defaultOptions); 
      }, 
      deps: [MockBackend, BaseRequestOptions] 
     }), 
     provide(XHRBackend, {useClass: MockBackend}) 
    ]); 



fit('should get response',inject([XHRBackend, MyService], (mockBackend, service) => { 
     console.log("inside fit"); 
     let response = "something returned from service"; 
     let responseOptions = new ResponseOptions({ body: response }); 

     mockBackend.connections.subscribe((connection: MockConnection) => { 
       connection.mockRespond(new Response(responseOptions)); 
     }); 

     service.getData('xyz').subscribe((a: MyModel[]) => { 
        expect(a.length).toBe(11); //this is NOT failing 
       expect(a).toContain(“something”); 

       }); //debugger not going inside subscribe 

    })); 

О отладки, метод подписки не выполняется. в результате мой тестовый пример проходит без выполнения. что мне не хватает?
P.S: MyService не используется и не используется внутри компонента в настоящий момент.

ответ

0

Наконец-то я понял, что это решение. Два изменения, которые я сделал:

  • использования async() как указано на @Gunter
  • stringify ответа прошел.

вот код:

fit('should get response',async(inject([XHRBackend, MyService], (mockBackend, service) => { //<--- wrap inside async call 
    console.log("inside fit"); 
    let response = "something returned from service"; 
    let responseOptions = new ResponseOptions({ body: JSON.stringify(response) }); //<--- stringify the response 

    mockBackend.connections.subscribe((connection: MockConnection) => { 
      connection.mockRespond(new Response(responseOptions)); 
    }); 

    service.getData('xyz').subscribe((a) => { 
        expect(a.length).toBe(11); //will fail 
        expect(a).toContain(“something”); //will pass 

       }); 

}))); 
0

Я думаю, вам нужно добавить async(...)

fit('should get response',async(inject([XHRBackend, MyService], (mockBackend, service) => { 

сделать тест ждать, пока все задачи не асинхронных сделано. В противном случае задаются задачи http.get(), а затем завершается тестирование.

+0

по какой-то причине, WebStorm бросает 'TS2345: Аргумент типа 'Функция' не может быть назначен для параметра типа '(сделано: DoneFn) => пустота' , Тип 'Функция' не соответствует подписи '(сделано: DoneFn): void' 'при использовании' inject' самостоятельно или 'async (inject (..' – candidJ

+0

Я немного запутался здесь, почему мы используем 'mockbackend 'тогда, если мы будем ждать, пока служба api вернет что-то. – candidJ

+1

Какая версия Angular2 вы используете? Я не понимаю ваш последний комментарий.' mockbackend' используется для предотвращения вызовов на сервер и для обеспечения возможности ответ от внутри теста. API-интерфейс службы ведет себя так же, как если бы вызов был сделан на сервере (даже если это фактически не так). –

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