2016-11-17 8 views
1

Есть ли способ проверить поведение тайм-аута HTTP службы?угловой 2 MockBackend тест http таймаут?

Я использую MockBackend даже при установке тайм-аута задания на 0 отсутствия регистрации «TIMEOUT».

export class MyHttpService { 
private sendGetRequest (job: HttpJob): Observable<any> { 
    return this.http.get(job.getUrl(), this.options) 
     .share() 
     .timeout(job.getTimeout(),() => this.requestTimeout(job)) 
     .catch((err) => this.errorHandler(err, job)); 
    }; 

    private requestTimeout(job: HttpJob): Error { 
    job.errorCode = ErrorCode.TIMEOUT; 
    console.log('TIMEOUT'); 
    return new Error('timeout'); 
    } 
... 

тест (ничего не зарегистрирован)

it('should resolve to TIMEOUT',() => { 
     job.timeout = 0; 
     let response: any; 
     service.sendRequest(job).subscribe(
     (res: Response) => { 
      response = res.json(); 
      console.log('OK', res); 
     }, 
     err => { 
      response = err; 
      console.log('ER', err); 
     } 
    ); 
     expect(job.errorCode).toEqual(ErrorCode.TIMEOUT); 
    }); 

Thx!

обновление: minimal example, если тайм-аут раскомментирован, он потерпит неудачу

ответ

1

Это потому, что разрешение метода subscribe является асинхронным. Вы пытаетесь протестировать синхронно.

it('..',() => { 
    doSomthing().subscribe(() => { 

    }) 
    expect(something) 
}) 

Здесь он ожидает синхронно перед любыми асинхронными задачами, инициированными подпиской. И тест завершается синхронно даже до того, как асинхронные задачи выполнены (именно поэтому вы никогда не увидите console.log)

Что вам нужно сделать, это использовать либо async и сделать ожидание в подписном обратном вызове

import { async } from '@angular/core/testing' 

it('..', async(() => { 
    doSomthing().subscribe(() => { 
    expect(something) 
    }) 
})) 

Или использовать fakeAsync и заставить поддельное синхронное разрешение по телефону tick

import { fakeAsync, tick } from '@angular/core/testing' 

it('..', fakeAsync(() => { 
    doSomthing().subscribe(() => { 
    // this is called when you tick 
    }) 
    tick(); 
    expect(something); 
})) 
+0

вы прав тест упаковки в асинхронном (..) получил меня рядом, однако теперь, если 'DoSomthing()' 'содержит тайм-аут (30000, новую ошибку ('....')) 'в наблюдаемой цепочке я получаю эту ошибку:' Не могу использовать setInterval из теста асинхронной зоны '. Как я могу проверить время ожидания HTTP? –

+0

Правильно, 'setInterval' не может вызываться из' async'. Может быть, и fakeAsync. И 'timeout' вызывает' setInterval' внутренне. Не уверен, что вы можете сделать. Дай мне подумать об этом. Я уверен, что он тоже потерпит неудачу, но попытайтесь использовать 'fakeAsync' –

+0

OK Я думаю, что получил решение. Вместо любого из них просто используйте жасмин native 'done'. 'it ('..', ((done) => {' и вызывать 'done' внутри обратного вызова после того, как вы сделаете это ожидание. Я полагаю, что это должно работать –

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

  • Нет связанных вопросов^_^