Мне нужно протестировать один из методов службы, и я не уверен, как добиться 100% покрытия кода для частей кода, которые запускаются в результате вызова какого-либо внедренного метода службы.
Метод обслуживания для проверки:
@Injectable()
export class BomRevisiosnsService {
constructor(
private baseService: BaseService,
private appConstants: AppConstants,
private dmConstants: DMConstants
) { }
public getRevisionsData(): any {
var itemId = this.appConstants.userPreferences.modelData['basicDetails']['itemId'];
let url = this.dmConstants.URLs.GETBOMREVISIONS + itemId + "/GetRevisionsAsync";
let headers = {
"Content-Type": "application/json",
UserExecutionContext: JSON.stringify(this.appConstants.userPreferences.UserBasicDetails),
}
if (itemId != null || itemId != undefined) {
return this.baseService.getData(url, headers)
.map(response => {
// this area not getting covered.
return response;
});
}
}
}
Как я покрываю:
.map(response => {
return response;
});
В следующих:
Тестовое задание:
it('should return response if itemId is not null or undefined', () => {
let mockData = [1,2,3];
let mockObservable = Observable.of(mockData);
spyOn(baseService, 'getData').and.returnValue(mockObservable);
appConstants.userPreferences.modelData['basicDetails']['itemId']=4; // itemId not null or undefined
dMConstants.URLs.GETBOMREVISIONS = "dummy url";
subject.getRevisionsData();
expect(baseService.getData).toBe(mockData); // How do I test .map()?
});
Встречный вопрос - вы действительно считаете, что это нуждается в тестировании? Это похоже на проверку базовой функциональности такого оператора, как +
. Хотя, если вы действительно хотите проверить, является ли базовая функция идентификации, используемая для сопоставления, базовой функцией идентификации, то почему бы не выделить ее и не написать тест только для этой функции?
@VLAZ Нет, я не думаю, что это добавит ценности модульному тестированию. Но я хотел выяснить это просто из любопытства.
Вы когда-нибудь понимали это? Я бегу против этого. Что я сделаю, если сделаю действие карты методом и протестирую его отдельно. Не идеально, потому что этот метод должен быть закрытым, но для тестирования он должен быть обнародован (я считаю).
@eflat проверьте отмеченный ответ
it('should return response if itemId is not null or undefined', () => {
...
const spy = spyOn(baseService.getData).and.return(mockedData)// you need to define data returned by baseService.getData
const result = subject.getRevisionsData();
expect(spy).toHaveBeenCalled(); // How do I test .map()?
expect(result).toEqual(mockedData);// for simple map it will be the same thing that is returned for more complicated map it may differ
});
Мой тест все еще не работает. Я получаю Expected [ 1, 2, 3 ] to be [ 1, 2, 3 ].
и нет доступного метода toBeEqual
. Только я использую toBe()
извините по памяти
Вы можете создать функцию, в которую вы передаете данные ответа и тестируете ее позже. С помощью spyOn вы можете убедиться, что он был вызван.