Функции модульного тестирования Angular

#angular #jasmine #angular-test

#angular #jasmine #angular-тест

Вопрос:

Я только начал изучать модульное тестирование в angular. У меня есть функция в файле .ts

 onValueChange(val: number): void {
this.formGroup.get(this.controlName).setValue(val);
}
 

Я пытаюсь проверить, имеет ли имя элемента управления значение, переданное в параметрах onValueChange

Я попробовал это в файле spec.ts

 it('form value should update from form changes', fakeAsync(() => {
onValueChange(5);
expect(component.formGroup.get(component.controlName)).toEqual(5); 
}));
function onValueChange(val: number): void {
component.formGroup.get(component.controlName).setValue(val);
}
 

что я делаю не так

Ответ №1:

Вы не сравниваете одни и те же вещи в своем заявлении expect.

 expect(component.formGroup.get(component.controlName).value).toEqual(5);
 

Вы пропустили ‘.value’

Помимо этого, я не думаю, что то, что вы делаете, будет считаться теоретическим тестированием исходной функции onValueChange. Я не уверен, почему у вас тестируемая функция находится внутри файла .ts, а не в файле .component.ts. Если ваша функциональность заключена в компоненте, вы можете легко настроить тестовый стенд, и вам не нужно повторять функциональность в тестовом файле.
Увы, если вы не можете поместить его в компонент, даже тогда я бы не рекомендовал воссоздавать исходную функциональность внутри тестового файла. В таких сценариях (идеальным решением было бы избежать таких сценариев) есть несколько обходных путей.

 import myTestFunc from 'myFile.ts';
describe('Test function', () => {
    let testObj;
    beforeEach(()=>{
        testObj = {myTestFunc: myTestFunc};
    });
    it('test', ()=>{
        expect(testObj.myTestFunc()).toBe(something);
    });
});
 

Что-то подобное даже позволяет вам использовать шпионов.