javascript - 在组件上测试 rxjs get 方法(服务)
问题描述
服务上的函数调用是这样的。
get getLayerToEdit(): BehaviorSubject<VectorLayer> {
return this.layerToEdit;
}
然后像这样在 ngOnInit 上调用它。
ngOnInit() {
this.annoService.getLayerToEdit.subscribe((layerToEdit: any) => {
this.layer = layerToEdit;
this.layerId = layerToEdit.ol_uid;
});
所以很自然地,在我的测试中,我想看看 component.layer 是否与该服务返回的内容相匹配。
测试文件
let component: EditFeatureComponent;
let fixture: ComponentFixture<EditFeatureComponent>;
let mockAnnoService = jasmine.createSpyObj(['getLayerToEdit', 'getCurrentAction', 'setCurrentAction']);
let layer;
每个代码块之前的第一个
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [EditFeatureComponent],
imports: [FormsModule, HttpClientModule],
providers: [
{ provide: AnnotationService, useValue: mockAnnoService}
],
schemas: [CUSTOM_ELEMENTS_SCHEMA]
})
.compileComponents();
}));
beforeEach(() => {
// Fields required for the component
layer = {
layerName: 'testLayer',
ol_uid: 1
}
// Create the testbed
fixture = TestBed.createComponent(EditFeatureComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
然后是实际测试
it('Should return a layer object and have a ol_uid of 1', ()=>{
mockAnnoService.getLayerToEdit.and.returnValue(of(layer))
fixture.detectChanges();
expect(component.layer).toBe(layer);
})
测试返回'this.annoService.getLayerToEdit.subscribe is not a function'
我也尝试过使用订阅而不是 of。
mockAnnoService.getLayerToEdit.and.returnValue({ subscribe: () => {} })
我对测试知之甚少,但这是我通常用来测试服务的方法,但这是我第一次从服务测试“get”方法,所以我假设我在某个地方出错了。
解决方案
您的mockAnnoService.getLayerToEdit是getter,因此您无法使用jasmine.createSpyObj模拟它,因为它仅以这种方式模拟方法。您需要创建普通对象而不是模拟对象,并将所需数据的可观察对象分配给getLayerToEdit字段。希望有帮助。
推荐阅读
- laravel - 我已经在我的应用程序 .env 中设置了我的域和密码,但我一直无法解析 mailgun 和 laravel 中的错误
- python-3.x - Python,数据框sql连接
- asp.net-core - Asp.net core swagger not found 和服务器错误
- python-3.x - 无法使用 Python SDK 从 Azure 而非公共 Blob 存储下载
- wpf - 文本框不跟随文本,当输入超过适合的内容时
- ios - 在用户更改之前无法从设置包中读取默认值
- excel - 有没有办法根据第一张分组将列值从一张表复制到另一张表作为行
- mongodb - 如何查询嵌套的mongo集合
- c++ - 我想让 + 和 = 符号出现在中间
- html - 将元素浮动到右侧