Наблюдаемый модульный тест пройден, когда он должен провалиться - PullRequest
0 голосов
/ 22 февраля 2019

Новичок в rxjs и angular, пытаясь написать несколько базовых модульных тестов для простого rxjs, наблюдаемого со сценарием успеха / ошибки:

Метод обслуживания:

export class MyService {

    constructor(private http: HttpClient) {}

    public getId(id) {
        return this.http.get('www.myurl.com/' + id, {
            withCredential: true,
            responseType: 'json' as 'json'
        })
        .pipe(
            map(response => {
                return response;
            }),
            catchError(() => {
                return 'Service returned error';
            })
        };
    }
}

Тест:

it('should throw an error',() => {
    spyOn(httpClientMock, 'get').and.returnValue(Observable.throw('error));

    myService.getId('test1')
        .subscribe(
            () => {},
            error => {
                expect(error).toEqual('Service returned error');
            }
        };
});

Вышеописанное проходит, однако, если я изменяю оператор ожидания на:

expect(error).toEqual('Service returned erro');

Модульный тест все еще проходит.

Если я выхожу из системы, я вижу:

S
e
r
v
i
c
e

r
e
t
u
r
n
e
d

e
r
r
o
r

1 Ответ

0 голосов
/ 22 февраля 2019

Кажется, проблема в том, что catchError ожидает, что Observable будет возвращен из обратного вызова fn, а не просто из значения.Попробуйте

import { of } from 'rxjs';

// ...

catchError(() => {
  return of('Service returned error');
})

см. Пример здесь https://observable -playground.github.io / gist / aa4e24897f4fce150dd92a6fdb0f5929

ОБНОВЛЕНИЕ

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

Например:

it('should throw an error',(done) => {
    spyOn(httpClientMock, 'get').and.returnValue(Observable.throw('error));

    myService.getId('test1')
        .subscribe(
            () => {},
            error => {
                expect(error).toEqual('Service returned error');
            },
            // We will call done when Observable completes
            () => done()
        };
});

Вот статья о Жасмин и асинхронностизвонки:

https://medium.com/dailyjs/unit-testing-async-calls-and-promises-with-jasmine-a20a5d7f051e

...