2016-01-26 3 views
1

так что моя проблема очень легко объяснитьУгловых 2 и испытание и асинхронная Кармы HTTP

это мой тест спецификация

import { 
    describe, 
    expect, 
    it, 
    inject, 
    beforeEachProviders 
} from 'angular2/testing_internal'; 
import {RestClient} from './rest.service'; 
import 'rxjs/add/operator/toPromise'; 
import 'rxjs/add/operator/delay'; 
import { 
    HTTP_PROVIDERS 
} from 'angular2/http'; 
export function main() { 
    describe('RestClient Service',() => { 
     beforeEachProviders(() => [HTTP_PROVIDERS, RestClient]); 
     it('is defined', inject([RestClient], (client) =>{ 
     client.get('http://jsonplaceholder.typicode.com/posts/1') 
     .delay(2000) 
     .toPromise() 
     .then((res) => { 
      console.log('test'); 
      expect(res.length).toBeGreaterThan(1000); 
     }); 
     })); 
    }); 
    } 

и этот метод в классе «RestClient», которые возвращают наблюдаемые

public get(url:string): Observable<any> { 
    return this.http.get(url).map(res => res.json()); 
} 

Итак, я запустить тест и тест возвращение

START: 
LOG: 'ciao' 
RestClient Service 
    ✔ is defined 
PhantomJS 2.0.0 (Mac OS X 0.0.0) LOG: 'ciao' 

Finished in 0.026 secs/0.038 secs 

SUMMARY: 
    ✔ 2 tests completed 

Для Karma все работает хорошо, и тест передается правильно и не соответствует действительности, и в то же время, если я ставлю console.log в «then», он никогда не вызывается. Сом, я полагаю, что это проблема с вызовами Async, есть ли у вас какие-либо идеи, как тестировать в Angular2 Async Calls Я также использовал Inject и AsyncInject. Я знаю, что я могу использовать MockBackend, но мне нужно проверить с внешними URL'

заранее спасибо за вашу помощь

+0

Вы хотите опубликовать свой обход этой проблемы? @cingusoft – candidJ

ответ

0

injectAsync должны решить вашу проблему, но вы должны вернуть обещание:

it('is defined', injectAsync([RestClient], (client) =>{ 
    return client.get('http://jsonplaceholder.typicode.com/posts/1') 
    .delay(2000) 
    .toPromise() 
    .then((res) => { 
    console.log('test'); 
    expect(res.length).toBeGreaterThan(1000); 
    }); 
})); 
+0

Привет @cexbrayat Благодарим вас за ответ, но я также протестировал injectAsync и все еще терпит неудачу. тестовый сценарий не ждет обещания и не имеет методов $ q с отсрочкой, которые позволяют «остановить» процесс до тех пор, пока обещание не завершит цикл. – cingusoft

+0

Какая Угловая версия вы используете? Он должен ждать обещания, если вы с достаточно недавним выпуском (например, beta.0 или beta.1). – cexbrayat

+0

версия beta.1, но я нашел решение Обязательно вводить AsyncTestCompleter следующим образом: 'it ('определено', injectAsync ([AsyncTestCompleter, RestClient], (async: AsyncTestCompleter, client: RestClient) => { client.get ('http://jsonplaceholder.typicode.com/posts/1') .then ((res) => { console.log ('ciaccia'); ожидать (res.length) .toBeGreaterThan (3); async.done(); }); })); ' Но теперь у меня есть проблемы с жасмином TIMEOUT, я буду исследовать – cingusoft

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