Угловая неопределенная ошибка при назначении массива другому массиву с фиктивными данными

#angular #typescript #unit-testing #jestjs #jasmine

Вопрос:

Я пытаюсь модульно протестировать компонент, в котором я получаю данные «Групп», используя класс распознавателя данных. вот код для этого.

 export class GroupsComponent implements OnInit, OnDestroy {
  group: IGroup;
  groups: IGroup[];

  constructor(
    private activatedRoute: ActivatedRoute,
    private titleService: Title,
    private userService: GroupsService
  ){
     this.titleService.setTitle('Home | Groups');
     this.groups = [];

     this.groupsComponentDataSubscription = this.activatedRoute
        .data
        .subscribe(
       data => {

        if(data['groupsResponse']){
           this.groupsResponse = data['groupsResponse'] as IGroupsResponse;
           this.groups = this.groupsResponse.groups;
       }
      })
    }
  }
 

Для тестирования я использую фиктивные данные для «группового ответа», как показано ниже:

 
let mockGroups: IGroup[] = [{
  groupName: "testGroup1",
  description : "group1 detail",
  apiRoles: ["foo", "bar", "monitoring"],
  kafkaClusters: [{
     clusterId: "cluster1",
     topics: ["foo", "bar"],
     connectClusters:[{
       clusteId: "testCluster1",
       connectorNames: ["foo", "bar"]
     }]
  }]
 },
groupName: "testGroup2",
  description : "group2 detail",
  apiRoles: ["foo", "bar", "foobar"],
  kafkaClusters: [{
     clusterId: "cluster2",
     topics: ["foo", "bar"],
     connectClusters:[{
       clusteId: "testCluster2",
       connectorNames: ["foo", "bar"]
     }]
  }]
 }
]

let mockGroupsResponse: IGroupsResponse = {
   groups: mockGroups
}
 

Затем я передаю это фиктивное значение для ActivatedRoute, как показано ниже:

 let activatedRouteMock: any;

beforeEach(waitForAsync(() => {

activatedRouteMock = {
  data: of({groupsResponse: [mockGroupsResponse]})
};

TestBed.configureTestingModule({
 imports:[...],
 declarations: [GroupsComponent],
 providers:[..., {provide: ActivatedRoute, useValue: activatedRouteMock }]
}).compileComponents

 

Мои фиктивные данные для решателя успешно считаны. Однако проблема, с которой я сталкиваюсь, заключается в том, что я пытаюсь назначить массив групп из ответа локальной переменной.

 constructor(
    private activatedRoute: ActivatedRoute,
    private titleService: Title,
    private userService: GroupsService
  ){
           ...
           ....
           this.groupsResponse = data['groupsResponse'] as IGroupsResponse; // groupsResponse is assigned as mock data -- console.log -> [{ groups: [object], [object]]
           this.groups = this.groupsResponse.groups; // here, not able to set this.groups array from groupsResponse. (undefined)
       }
      })
    }
  }
 

Любая идея о том, что я делаю не так с моком. В реальном сценарии, когда я получаю данные от распознавателя, используя http в качестве обещания, у меня нет никаких проблем с настройкой массива. Однако мой тест не работает

Ответ №1:

Удаляет вызовы API из конструктора и перемещает их в ngOnInit.

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

Комментарии:

1. Я могу получить фиктивные данные в конструкторе, но проблема заключается в назначении массива из возвращаемого объекта другому массиву .. строка ниже задана не так, как ожидалось //this.groups = this.groupresponse.groups

2. просто дикое предположение, может ли это быть проблемой: данные: из({groupsResponse: [mockGroupsResponse]}) должны быть данными: из({groupsResponse: mockGroupsResponse })

3. Большое спасибо, в этом и была проблема, лол. Я проходил как массив ..