4Manuals

  • PDF Cloud HOME

角度单元测试-组件中的服务模拟 Download

    条形码扫描仪插件 如何将动态模板引用Click事件绑定到跨度? Jspdf在最新的Chrome版本中保存时间过长(79.0.3945.88) IIS 10中的网址重写 Angular 7:类型为radio的复选框,使用ngModel还是change-function? 如何编写Azure功能的单元测试用例? 为什么Qr代码没有使用HTML元素下载 如何使用ngx-pagination显示特定页面中存在的记录数 清单提取失败,返回状态404 构建StaticInjectorError时出现Angular 7

我是角度测试的新手,并尝试使用Angular实施模拟服务的基本测试。 调用personalsettingmock.getPersonalSettings时出现“无法读取未定义的订阅” app.component.spec.ts

import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { PersonalSettingsComponent } from './personal-settings.component';
import { PersonalSettingsService } from './personal-settings.service';
import { NO_ERRORS_SCHEMA } from '@angular/core';
import { NotifyService } from 'src/app/_services/notify.service';
import { LoaderEmitterService } from 'src/app/_services/loader-emitter.service';
import { of } from 'rxjs/internal/observable/of';

fdescribe('PersonalSettingsComponent', () => {
  let component: PersonalSettingsComponent;
  let fixture: ComponentFixture<PersonalSettingsComponent>;
  let personalSettingsServiceMock;
  let notifyServiceMock;
  let loaderEmitterServiceMock;
  let data = {
    email: 'asd', firstName: 'sff', lastName: 'sdf', phoneMobile: '+12355'
  };
  beforeEach(async(() => {
    personalSettingsServiceMock = jasmine.createSpyObj(['getPersonalSettings']);
    notifyServiceMock = jasmine.createSpyObj(['notifyUser']);
    loaderEmitterServiceMock = jasmine.createSpyObj('LoaderEmitterSerivce', ['emitChange']);
    TestBed.configureTestingModule({
      declarations: [PersonalSettingsComponent],
      imports: [
      ],
      providers: [
        {
          provide: NotifyService,
          useValue: notifyServiceMock
        },
        {
          provide: LoaderEmitterService,
          useValue: loaderEmitterServiceMock
        }
      ],

      schemas: [
        NO_ERRORS_SCHEMA
      ]
    });
    TestBed.overrideProvider(PersonalSettingsService,{useValue: personalSettingsServiceMock});
    TestBed.compileComponents();
  }));

  beforeEach(() => {
   fixture = TestBed.createComponent(PersonalSettingsComponent);
   component = fixture.componentInstance;
   personalSettingsServiceMock.getPersonalSettings.and.returnValue(of(data));
   fixture.detectChanges();
  });


  it('should get user data from userService', () => {
    expect(component).toBeTruthy();
    expect(component.personalData).toBe(data);
    fixture.detectChanges();
  })

});

app.component.ts 下面是我需要在组件中测试的方法

getUserData () {
    this._loaderEmitter.emitChange(APP_CONSTANTS.SHOW_LOADING);
    this.personalSettingsService.getPersonalSettings().subscribe( (responseData:PERSONAL_DATA) => {
      this._loaderEmitter.emitChange(APP_CONSTANTS.HIDE_LOADING);
      this.personalData = responseData;
      this.setSettingsData();
      this.personalData = _.omit(this.personalData, 'email');
      this.setChangeDetection();
    });
  }

谢谢。

1 个答案:

答案 0 :(得分:1)

它表明getPersonalSettings的“真实”实现使用了您订阅的Observable,因此在测试中,您必须模拟Observable

import { of } from 'rxjs';

personalSettingsServiceMock = jasmine.createSpyObj('PersonalSettingsService', {
  getPersonalSettings: of({})
});

,然后您还需要通过以下方式将其添加到提供程序中:

{
  provide: PersonalSettingsService,
  useValue: personalSettingsServiceMock
}



Similar searches
    获取org.apache.avro.UnresolvedUnionException:与从MSSQL进行sqoop导入的union [“ null”,“ long”]不在类型为smallDateTime的列中 Docker卷确实在ngnix容器中列出了我的媒体内容 如何在Python中打印此输出[自上而下(偶数)] [自下而上(奇数)] 使用Shell脚本删除折线 我的精灵只有在靠近玩家时才会翻转