TypeError: Cannot read property 'pipe' of undefined (jasmine, angular)

TypeError: Cannot read property 'pipe' of undefined (jasmine, angular)

我在 Angular 中遇到有关单元测试的错误。错误是 TypeError: Cannot read 属性 'pipe' of undefined。为此,我使用了一个可观察对象,并尝试测试订阅的输出。我将不胜感激任何帮助!谢谢!

  obs1$: Observable<number>;
  pos=12345;

  constructor(
    private service1: Service) {
  }

  ngOnInit() {

    this.obs1$ = this.service1.retrieveData1(this.pos)
      .pipe(
        map(item => item.value || null))

  }
 let component: ComponentName;
  let fixture: ComponentFixture<ComponentName>;

  const serviceSpy = jasmine.createSpyObj('Service',['retrieveData1']);

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [ComponentName],
      providers: [{ provide:Service, useValue: {} }
    })
      .overrideComponent(ComponentName, {
        set: {
          providers: [
            { provide: ComponentName, useValue: serviceSpy }
          ]
        }
      })
      .compileComponents();
  }));

  beforeEach(() => {
    fixture = TestBed.createComponent(ComponentName);
    component = fixture.componentInstance;
  });
 
 fit('should retrieve value', done => {
    component.pos = 12345;
    fixture.detectChanges();
    component.obs1$.subscribe(value => {
      expect(value).toEqual(1);
      done();
    })
  })
<div *ngIf="obs1$ | async as obs">
    <div [ngSwitch]="obs" class="col-2 p-0">
      <div *ngSwitchCase="0">
         <p>red</p>
       </div>
     </div>
 </div>

您必须 return 在 serviceSpy.retrieveData1 一个 Observable 上。 Simpelst 案例创建一个类似于 serviceSpy.retrieveData1 = of({value: []}) 的案例并提供您的数据。 因为现在 mock returns 未定义,而您的组件期望 observable 在其上使用函数“pipe”。这是不可能的

创建间谍后,您还需要 return 一个 dummy/mock 可观察值。

代码需要一个 Observable,所以您可以尝试下面的方法(在每个 it 块中,您可以添加这个调用服务)

serviceSpy.retrieveData1.and.returnValue(of('mock value as requires'))

或者您可以像这样模拟服务

let serviceSpy= jasmine.createSpyObj('Service', {
    'retrieveData1': of('mock data'),
    'other': 'some val'
});