Как смоделировать метод get FormGroup, не используя TestBeds? - PullRequest
0 голосов
/ 28 марта 2020

У меня есть компонент, я объявил одно из его свойств как groupForm : FormGroup. В одном из методов я получаю значение поля формы и присваиваю его постоянной:

const value = this.groupForm.get('field').value;

Позже я использую эту константу, чтобы проверить одно условие и сделать что-то вроде:

if (value.$type === 'Variable') {
    // do something
}

В файле компонента .spe c .ts я пишу пример модульного теста с использованием Jasmin и Karma, я пытаюсь смоделировать это как:

let groupFormMock = spyOn(component.groupForm, 'get')
groupFormMock.and.returnValues({
    value: {
        $type: "Variable",
        name: "Variable",
        variableType: "Text",
        description: "Variable",
        category: "Actions",
        subCategory: "Variable",
        initialValue: "Test",
        sortOrder: 0
    }
})

Но я получаю эту ошибку:

Argument of type '{ value: { $type: string; name: string; variableType: string; description: string; category: string; subCategory: string; initialValue: string; sortOrder: number; }; }' is not assignable to parameter of type 'AbstractControl'.
  Type '{ value: { $type: string; name: string; variableType: string; description: string; category: string; subCategory: string; initialValue: string; sortOrder: number; }; }' is missing the following properties from type 'AbstractControl': validator, asyncValidator, _parent, _asyncValidationSubscription, and 43 more.

Итак, я подумал, что утешение значения JSON.stringify(this.groupForm.get('variableName')) и возвращение его как фиктивного объекта решит проблему, но это дало мне еще одну ошибку:

An error occurred: Converting circular structure to JSON
    --> starting at object with constructor 'Subscriber'
    |     property '_subscriptions' -> object with constructor 'Array'
    |     index 0 -> object with constructor 'SubjectSubscription'
    --- property '_parentOrParents' closes the circle

Объект, возвращаемый методом get, является круглым объектом (ссылающимся на себя), который не может быть утешен. Итак, мне нужно создать фиктивный объект AbstractControl, чтобы я мог использовать это и вернуть его в методе фиктивного. Или любые решения для решения этой проблемы приветствуются.

Я застрял, любые выводы будут полезны.

PS: Мне нужно сделать это без использования TestBeds.

1 Ответ

0 голосов
/ 31 марта 2020

В файле .spe c .ts объявите фиктивные объекты следующим образом:

let formGroupMock: FormGroup;
let formBuilderMock: any;

Инициализируйте объекты и смоделируйте метод FormBuilder * group(). Вызовите как:

formGroupMock = new FormGroup({
    field : new FormControl()
});
formBuilderMock = jasmine.createSpyObj('FormBuilder', ['group']);
formBuilderMock.group.and.returnValue(formGroupMock);

Запишите значения в форму как:

formGroup.patchValue({
    field : {
        $type: "Variable",
        name: "Variable",
        variableType: "Text",
        description: "Variable",
        category: "Actions",
        subCategory: "Variable",
        initialValue: "Test",
        sortOrder: 0
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...