TypeError:无法读取未定义的属性“获取”(修复冲突导入不起作用)

Posted

技术标签:

【中文标题】TypeError:无法读取未定义的属性“获取”(修复冲突导入不起作用)【英文标题】:TypeError: Cannot read property 'get' of undefined (Fixed conflicting imports not working) 【发布时间】:2020-03-07 09:09:17 【问题描述】:

尝试运行 karma TS 规范文件时出错。所有模块和导入似乎都工作正常,没有冲突。尝试将component.ngOninit() 添加到 beforeEach() 和 it() 中但没有任何成功。查看类似问题与 HttpClientTestingModule 导入冲突或其他提供程序/声明冲突有关。我无法确定为什么 TypeError: Cannot read property 'get' of undefined is not allowed this spec file to pass

规格文件

import async, ComponentFixture, TestBed from '@angular/core/testing';

import AcaPersonComponent from './aca-person.component';
import 
  MatCardModule, MatDividerModule,
  MatFormFieldModule,
  MatIconModule,
  MatInputModule,
  MatOptionModule,
  MatRadioModule,
  MatSelectModule
 from '@angular/material';
import ReactiveFormsModule from '@angular/forms';
import MFGDatePickerModule from 'mfg-datepicker';
import TextMaskModule from 'angular2-text-mask';
import AppRoutingModule from '../../../../../app-routing.module';
import HttpClientTestingModule from '@angular/common/http/testing';
import BrowserAnimationsModule from '@angular/platform-browser/animations';
import LandingPageComponent from '../../../../../landing-page/landing-page.component';

describe('AcaPersonComponent', () => 
  let component: AcaPersonComponent;
  let fixture: ComponentFixture<AcaPersonComponent>;

  beforeEach(async(() => 
    TestBed.configureTestingModule(
      declarations: [
        AcaPersonComponent,
        LandingPageComponent],
      imports: [MatFormFieldModule,
        ReactiveFormsModule,
        MatIconModule,
        MatInputModule,
        MFGDatePickerModule,
        MatOptionModule,
        MatSelectModule,
        MatRadioModule,
        MatCardModule,
        TextMaskModule,
        AppRoutingModule,
        BrowserAnimationsModule,
        HttpClientTestingModule,
        MatDividerModule
      ]
    )
      .compileComponents();
  ));

  beforeEach(() => 
    fixture = TestBed.createComponent(AcaPersonComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
    component.ngOnInit();
  );

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

错误

TypeError: Cannot read property 'get' of undefined
    error properties: Object( ngDebugContext: DebugContext_( view: Object( def: Object( factory: Function, nodeFlags: 33669121, rootNodeFlags: 33554433, nodeMatchedQueries: 0, flags: 0, nodes: [ Object( nodeIndex: 0, parent: null, renderParent: null, bindingIndex: 0, outputIndex: 0, checkIndex: 0, flags: 33554433, childFlags: 114688, directChildFlags: 114688, childMatchedQueries: 0, matchedQueries: Object(  ), matchedQueryIds: 0, references: Object(  ), ngContentIndex: null, childCount: 1, bindings: [  ], bindingFlags: 0, outputs: [  ], element: Object( ns: '', name: 'app-aca-person', attrs: [  ], template: null, componentProvider: Object( nodeIndex: 1, parent: <circular reference: Object>, renderParent: <circular reference: Object>, bindingIndex: 0, outputIndex: 0, checkIndex: 1, flags: 114688, childFlags: 0, directChildFlags: 0, childMatchedQueries: 0, matchedQueries: Object, matchedQueryIds: 0, references: Object, ngContentIndex: -1, childCount: 0, bindings: Array, bindingFlags: 0, outputs:  ...
        at <Jasmine>
        at AcaPersonComponent.get type [as type] (http://localhost:9876/_karma_webpack_/src/app/aca/aca-stepper/aca-steps/aca-step-2/aca-person/aca-person.component.ts:70:28)
        at AcaPersonComponent.ngOnInit (http://localhost:9876/_karma_webpack_/src/app/aca/aca-stepper/aca-steps/aca-step-2/aca-person/aca-person.component.ts:24:14)
        at checkAndUpdateDirectiveInline (http://localhost:9876/_karma_webpack_/node_modules/@angular/core/fesm2015/core.js:31909:1)
        at checkAndUpdateNodeInline (http://localhost:9876/_karma_webpack_/node_modules/@angular/core/fesm2015/core.js:44366:1)
        at checkAndUpdateNode (http://localhost:9876/_karma_webpack_/node_modules/@angular/core/fesm2015/core.js:44305:1)
        at debugCheckAndUpdateNode (http://localhost:9876/_karma_webpack_/node_modules/@angular/core/fesm2015/core.js:45327:36)
        at debugCheckDirectivesFn (http://localhost:9876/_karma_webpack_/node_modules/@angular/core/fesm2015/core.js:45270:1)
        at Object.eval [as updateDirectives] (ng:///DynamicTestModule/AcaPersonComponent_Host.ngfactory.js:7:5)
        at Object.debugUpdateDirectives [as updateDirectives] (http://localhost:9876/_karma_webpack_/node_modules/@angular/core/fesm2015/core.js:45258:1)
        at checkAndUpdateView (http://localhost:9876/_karma_webpack_/node_modules/@angular/core/fesm2015/core.js:44270:1)
    TypeError: Cannot read property 'get' of undefined
        at <Jasmine>
        at AcaPersonComponent.get type [as type] (http://localhost:9876/_karma_webpack_/src/app/aca/aca-stepper/aca-steps/aca-step-2/aca-person/aca-person.component.ts:70:28)
        at AcaPersonComponent.ngOnInit (http://localhost:9876/_karma_webpack_/src/app/aca/aca-stepper/aca-steps/aca-step-2/aca-person/aca-person.component.ts:24:14)
        at UserContext.<anonymous> (http://localhost:9876/_karma_webpack_/src/app/aca/aca-stepper/aca-steps/aca-step-2/aca-person/aca-person.component.spec.ts:58:15)
        at ZoneDelegate.invoke (http://localhost:9876/_karma_webpack_/node_modules/zone.js/dist/zone-evergreen.js:365:1)
        at ProxyZoneSpec.onInvoke (http://localhost:9876/_karma_webpack_/node_modules/zone.js/dist/zone-testing.js:305:1)
        at ZoneDelegate.invoke (http://localhost:9876/_karma_webpack_/node_modules/zone.js/dist/zone-evergreen.js:364:1)
        at Zone.run (http://localhost:9876/_karma_webpack_/node_modules/zone.js/dist/zone-evergreen.js:124:1)
        at runInTestZone (http://localhost:9876/_karma_webpack_/node_modules/zone.js/dist/zone-testing.js:554:1)
        at UserContext.<anonymous> (http://localhost:9876/_karma_webpack_/node_modules/zone.js/dist/zone-testing.js:569:1)
        at <Jasmine>

TS类

import Component, EventEmitter, Input, OnInit, Output from '@angular/core';
import FormGroup, Validators from '@angular/forms';
import merge from 'rxjs';

@Component(
  selector: 'app-aca-person',
  templateUrl: './aca-person.component.html',
  styleUrls: ['./aca-person.component.css']
)
export class AcaPersonComponent implements OnInit 

  @Input() personType: string;
  @Input() peopleForm: FormGroup;
  @Input() nextWasClicked: boolean;
  @Input() index: number;
  @Output() removePerson = new EventEmitter<boolean>();
  cardTitle: string;
  personAge: number;

  constructor() 
  

  ngOnInit() 
    if (this.type.value == 'primary') 
      this.cardTitle = 'Your Information';
     else if (this.type.value == 'spouse') 
      this.cardTitle = 'Spouse';
     else if (this.type.value == 'dependent') 
      this.cardTitle = 'Dependent';
    
    this.dobAndIsPregnantVC();
  

  dobAndIsPregnantVC() 
    merge(
      this.dob.valueChanges,
      this.gender.valueChanges
    )
      .subscribe(() => 
        this.calculateAge(this.dob.value);
        if (this.gender.value == 'F') 
          this.is_pregnant.setValidators(Validators.required);
          if (this.personAge < 14) 
            this.is_pregnant.setValue(null);
            this.is_pregnant.clearValidators();
          
         else 
          this.is_pregnant.setValue(null);
          this.is_pregnant.clearValidators();
        
        this.is_pregnant.updateValueAndValidity();
      );
  

  // Calculate the age of the client from their birth date to display in the census details
  private calculateAge(date: string) 
    if (date) 
      const timeDiff = Math.abs(Date.now() - new Date(date).getTime());
      this.personAge = Math.floor(timeDiff / (1000 * 3600 * 24) / 365.25);
    
  

  onRemovePerson() 
    this.removePerson.emit(true);
  

  // GETTERS

  get type() 
    return this.peopleForm.get('type');
  

  get first_name() 
    return this.peopleForm.get('first_name');
  

  get last_name() 
    return this.peopleForm.get('last_name');
  

  get gender() 
    return this.peopleForm.get('gender');
  

  get dob() 
    return this.peopleForm.get('dob');
  

  get uses_tobacco() 
    return this.peopleForm.get('uses_tobacco');
  

  get affordable_care() 
    return this.peopleForm.get('affordable_care');
  

  get is_pregnant() 
    return this.peopleForm.get('is_pregnant');
  



【问题讨论】:

【参考方案1】:

它的发生是因为您的测试用例中没有定义@Input,因此您需要按如下方式创建它:

  beforeEach(() => 
    fixture = TestBed.createComponent(AcaPersonComponent);
    component = fixture.componentInstance;
    component.peopleForm = fb.group(
       type:  ['Other Name', Validators.required],
       first_name: ['f_name', Validators.required],
       //.. and so on for all params
    );
    component.personType = 'Some Type';
    component.nextWasClicked = true;
    component.index = 1; // or whatever is required
    fixture.detectChanges();
  );


这将帮助您定义this.peopleForm,因此像this.peopleForm.get('type'); 这样的行不会出现此类错误

不用加component.ngOnInit()

【讨论】:

以上是关于TypeError:无法读取未定义的属性“获取”(修复冲突导入不起作用)的主要内容,如果未能解决你的问题,请参考以下文章

使用 Sequelize 获取“TypeError:无法读取未定义的属性‘findAll’”

TypeError:无法读取未定义的属性(读取“国家”)

TypeError:无法读取未定义的属性“获取”(Node.js)

无法从 nextjs 中的 api 获取图像-TypeError:无法读取未定义的属性(读取“地图”)NEXTJS

TypeError:无法读取未定义的属性“获取”(修复冲突导入不起作用)

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