Как получить покрытие для насмешливых методов в Jasmine для Angular7 Promises - PullRequest
0 голосов
/ 19 января 2019

Жасминовый тест для службы angular 7, который возвращает объект Promise, не отражается в покрытии кода.

@Injectable()
export class MyService {
constructor(private http:HttpClient,private httpService: HttpService) { 
}

getAllRecords (requestData: MyRequest): Promise<MyResponse> {
    return new Promise((resolve, reject) => {
        let url:string = `${ApiUrl.getUrl}`;
        this.httpService.makeHttpGetRequest(url, requestData)
        .subscribe((response) => {
            resolve(response.body);
        }, (error) => {
            reject();
        });
    });
}
}

Test

describe('MyService', function () {
let myService: MyService;
it('getAllRecords should have been called and return all records', (done) => {
        const spy = spyOn(myService, 'getAllRecords').and.returnValue(Promise.resolve({ id: 1 }));

        myService.getAllRecords(null);
        spy.calls.mostRecent().returnValue.then(() => {


            expect(myService.getAllRecords).toHaveBeenCalledWith(null);
            done();
        });
    })
})

Тест проходит успешно, но не отражается в отчете о покрытии кода, созданном в Стамбуле, тест комментирования не влияет на процент покрытия кода.

1 Ответ

0 голосов
/ 20 января 2019

Вы указываете метод, когда объявляете:

const spy = spyOn(myService, 'getAllRecords').and.returnValue(Promise.resolve({ id: 1 }));

Сам метод никогда не будет введен, потому что ваш шпион возвращает другое значение от его имени.

Я бы предложилчто вместо того, чтобы устанавливать шпиона на myService.getAllRecords(), вы вместо этого устанавливаете шпиона на httpService.makeHttpGetRequest() и возвращаете холодную наблюдаемую, которая немедленно завершается с различными значениями, чтобы проверить и счастливый путь, и случай ошибки.

...