簡體   English   中英

Karma 單元測試 EventEmitter 發射和訂閱失敗,無法讀取未定義的屬性“訂閱”

[英]Karma unit test EventEmitter emit and subscribe failed, Cannot read property 'subscribe' of undefined

我是 Angular/Node UT 的新手,目前,我添加了 karma 和 jasmine 來運行單元測試,我的應用程序基於 Angular7 + Node 8,遵循Angular 測試文檔,大多數測試用例運行成功,但有些情況像@Input @Output ( EventEmitter ) 數據測試失敗。 請查看我的代碼並配置如下:

package.json

    "jasmine-core": "~2.99.1",
    "jasmine-spec-reporter": "~4.2.1",
    "karma": "~3.0.0",
    "karma-chrome-launcher": "~2.2.0",
    "karma-coverage-istanbul-reporter": "~2.0.1",
    "karma-jasmine": "~1.1.2",
    "karma-jasmine-html-reporter": "^0.2.2"

a.component.ts

userDetailInit(){
    this.lookupService.genericServiceCall1(this.componentIds.componentUserDetail);
    this.lookupService.compomentJsonEmit.subscribe(async o => {
      // logic
    }, error => {
      this.error("System Error");
    });
  }

lookupService

    genericServiceCall1(iD) {
      let param = {
        'id': iD
      };
      this.compomentJsonEmit = new EventEmitter<Object>();
      // getData() is a http request and will return data
      this.commonService.getData('Get', param).subscribe(o =>{
        this.compomentJsonEmit.emit(o);
      });
    }

在單元測試文件agent-details.component.spec.ts中:

describe('UserDetailsComponent', () => {

  let spy = {
    compJSONSpy: jasmine.createSpyObj('lookupService', ['genericServiceCall1']),
  }


  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [ UserDetailsComponent ],
      imports: [FormlyModule.forRoot(), HttpClientTestingModule],
      providers: [
        {provide: CommonService, useValue:  spy.comSpy },
        {provide: LookupService, useValue: spy.compJSONSpy}
      ],
      schemas: [NO_ERRORS_SCHEMA ]
    }).compileComponents();
    fixture = TestBed.createComponent(UserDetailsComponent);
    component = fixture.componentInstance;
    httpClient = TestBed.get(HttpClient);
    httpTestingController = TestBed.get(HttpTestingController);
  }));


  it('#timeChange(val) should set selectTimeZone to val', () => {
    compJSONSpyReturn = spy.compJSONSpy.genericServiceCall1.and.returnValue(of(spyReturnJson.UserDetailCompJson));
    component.componentIds = {
      componentUserDetail: 1007
    };

    // error occurred when run component.timeChange(12);
    component.timeChange(12);
    expect(compJSONSpyReturn.calls.any()).toBeDefined();
    expect(component.selectTimeZone).toEqual(12);
  });
});

因果報應報告:

TypeError: Cannot read property 'subscribe' of undefined
    at userDetailsComponent.subscribe [as userDetailInit] (http://localhost:9876/_karma_webpack_/webpack:/src/app/admin/user-details/user-details.component.ts:77:46)
    at userDetailsComponent.userDetailInit [as timeChange] (http://localhost:9876/_karma_webpack_/webpack:/src/app/admin/user-details/user-details.component.ts:109:14)
    at UserContext.<anonymous> (http://localhost:9876/_karma_webpack_/webpack:/src/app/admin/user-details/user-details.component.spec.ts:66:15)
userListComponent #ngOninit() should be run

this.lookupService.compomentJsonEmit undefined

嘗試:

const compomentJsonEmitSubject = new BehaviorSubject('hello'); // you can mock it how you like instead of 'hello'
describe('UserDetailsComponent', () => {
 let spy = {
    compJSONSpy: jasmine.createSpyObj('lookupService', ['genericServiceCall1']),
  }
 spy.compJSONspy.compomentJsonEmit = componentJsonEmitSubject;
 beforeEach(async(() => {
....

然后稍后在您的測試中,如果您想要一個新的componentJsonEmit值,您可以執行componentJsonEmitSubject.next('goodbye');

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM