Angular Unit Test: как имитировать свойства в методе?

Вот служба, которую я пытаюсь протестировать:

@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";

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
712
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Да, действительно, вам нужно указать допустимое значение для 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.

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

Другие вопросы по теме