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'
});
我在 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'
});