Вот служба, которую я пытаюсь протестировать:
@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 => {
return response;
});
}
}
}
файл спецификаций
describe('bom-revisions.service ',()=>{
let bomRevisiosnsService:BomRevisiosnsService;
let baseService: BaseService;
let appConstants: AppConstants;
let dmConstants: DMConstants;
beforeEach(()=>{
baseService=new BaseService(null,null);
appConstants=null;
dmConstants=null;
bomRevisiosnsService=new BomRevisiosnsService(baseService,appConstants,dmConstants);
});
it('getRevisionsData() call base service getData()',()=>{
let spy = spyOn(baseService, 'getData').and.returnValue(Observable.of())
bomRevisiosnsService.getRevisionsData();
expect(baseService.getData).toHaveBeenCalled();
});
})
Error: TypeError: Cannot read property 'userPreferences' of null
Я считаю, что мне нужно предоставить какое-то фиктивное значение для this.appConstants.userPreferences.modelData['basicDetails']['itemId'];
и this.dmConstants.URLs.GETBOMREVISIONS + itemId + "/GetRevisionsAsync";



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Да, действительно, вам нужно указать допустимое значение для appConstants и dmConstants, потому что вызов bomRevisiosnsService.getRevisionsData() использует эту информацию внутри.
Таким образом, вместо того, чтобы присваивать nullappConstants и dmConstants, вы можете создать объекты с некоторыми допустимыми данными, например так:
appConstants = {
userPreferences: {
modelData: {
basicDetails: {
itemId: 3 // some other valid value here is fine
}
},
UserBasicDetails: {
// some valid values here, maybe
}
}
};
dmConstants = {
URLs: {
GETBOMREVISIONS: 'revisions' // or just some valid value according to the use case
}
};
И то же самое касается baseService.
Как правило, вам необходимо создать допустимую заглушку, макет и т. д. для всех объектов, служб и т. д., которые используются внутри тестируемой службы.