【问题标题】:Cannot read property 'findIndex' of undefined无法读取未定义的属性“findIndex”
【发布时间】:2018-10-22 10:30:47
【问题描述】:

我正在尝试测试我的应用程序中的一个组件。在这个组件的构造函数中,我有一个函数findIndex,是这样的:

  dels: Del[];
  selectedDel: number = null; // It is a index
  selectedMun: number = null; // It is a index

    constructor(private _emitService: EmitService, private _locService: LocService) {
        let data = <Perfil>JSON.parse(localStorage.getItem('data'));
        this.dels = data.dels;
        this.selectedDel = this.dels.findIndex(x => x.id_del == JSON.parse(localStorage.getItem('Del')));
        this.changeDel(this.selectedDel);
        this.selectedMun = JSON.parse(localStorage.getItem('Mun'));
        _emitService.filter({ idEvent: 'CloseSidenav' });
      }

我正在尝试做一个简单的“应该创建”,但收到此错误:

TypeError: 无法读取未定义的属性“findIndex”

我的测试:

  beforeEach(() => {
    fixture = TestBed.createComponent(ChangeDelMunComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });

  it('should create', () => {
    expect(component).toBeTruthy();
  });
});

我也试过这个,但没有成功:

  beforeEach(() => {
    fixture = TestBed.createComponent(ChangeDelMunComponent);
    component = fixture.componentInstance;        
  });

  it('should create', () => {
    localStorage.setItem('data', '{"id_user":"1234edr","dels":[{"id_del":50,"desc":"DESC 1","mun":[]}');
    localStorage.setItem('Del', '11');
    fixture.detectChanges();
    expect(component).toBeTruthy();
  });
});

我用谷歌搜索了它,但没有找到任何东西。我做错了什么?任何帮助,将不胜感激。提前致谢!

编辑:将测试更新为:

describe('ChangeDelMunComponent', () => {
  let component: ChangeDelMunComponent;
  let fixture: ComponentFixture<ChangeDelMunComponent>;
    beforeEach(() => {
        TestBed.configureTestingModule({
          imports: [
            BrowserAnimationsModule,
            FormsModule,
            MatIconModule,
            MatCardModule,
            MatSelectModule,
            MatProgressBarModule,
            MatButtonModule,
            ToastrModule.forRoot(),
            HttpClientModule,
          ],
          declarations: [ChangeDelMunComponent],
          providers: [
            EmitService,
            LocalizacionesService
          ]
        })
          .compileComponents().then(() => {
            fixture = TestBed.createComponent(ChangeDelMunComponent);
            component = fixture.componentInstance;
            localStorage.setItem('data', '{"id_user":"1234edr","dels":[{"id_del":50,"desc":"DESC 1","mun":[]}');
            localStorage.setItem('Del', '11');
          });
      });

      it('should create', () => {
        fixture.detectChanges();
        expect(component).toBeTruthy();
      });
    });

错误findIndex消失了,但又来了一个错误:

TypeError: 无法读取未定义的属性“detectChanges”

【问题讨论】:

  • 你的 _locService.getData() 方法是什么样的?

标签: angular unit-testing karma-jasmine


【解决方案1】:

尝试使用

Object.values(dels).findIndex(what_you're_looking for)

【讨论】:

    【解决方案2】:

    问题

    您正在尝试从异步服务获取数据,并且您在数据可用之前检索数据。

    修复

    Subscribe 是从服务类返回的Observable

    你的代码应该是这样的

     constructor(private _emitService: EmitService, private _locService: LocService) {
             = _locService.getData().subscribe(dels=>{ //subscribe the observable 
              this.dels = dels;
                this.selectedDel = this.dels.findIndex(x => x.id_del == JSON.parse(localStorage.getItem('Del')));
            this.changeDel(this.selectedDel);
            this.selectedMun = JSON.parse(localStorage.getItem('Mun'));
            _emitService.filter({ idEvent: 'CloseSidenav' });
    
         })
    
     }
    

    【讨论】:

    • 抱歉,我在复制代码时出错,我将它与另一个非常相似的组件混淆了。情况是它不取服务的数据,而是获取localStorage的数据。我已经在 localStorage 中定义了该对象,但错误仍然存​​在
    【解决方案3】:

    我遇到了同样的问题,解决我的问题是避免使用未定义的 (array: undefined) 初始化数组,而是使用 array: []

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-06
      • 2020-10-30
      • 2019-10-09
      • 1970-01-01
      相关资源
      最近更新 更多