【问题标题】:How to spyon an observable property如何监视可观察的属性
【发布时间】:2020-11-12 04:27:58
【问题描述】:

我想对 Angular 10 组件进行单元测试。在组件的ngOnInit方法中,出现了这段代码:

this.subscriptions.push(
   this.myService.getDataSubject.subscribe((results) => {
      this.data = results;
   }
);

还有,在单元测试中

beforeEach(async(() => {
    TestBed.configureTestingModule({
        providers: [MyService]
    }).compileComponents();
})

我的单元测试包括

beforeEach(() => {
    spyOnProperty(myService, 'getDataSubject', 'get').and.returnValue(of(mockData));
}

在服务本身中

private dataSubject: BehaviorSubject<any> = new BehaviorSubject({});
getDataSubject = this.dataSubject.asObservable();

单元测试失败。我尝试了多种变体,但无法返回要返回的 mockData 值。在为订阅与 BehaviorSubject 相关的属性的组件编写单元测试时,我应该怎么做?

【问题讨论】:

    标签: angular unit-testing observable karma-jasmine behaviorsubject


    【解决方案1】:

    改变

    beforeEach(() =&gt; { spyOnProperty(myService, 'getDataSubject', 'get').and.returnValue(of(mockData)); }

    beforeEach(() => {
        spyOn(myService, 'getDataSubject').and.callFake(()=>of(MockData));
    }
    

    监视函数而不是属性

    【讨论】:

    • 该更改会导致错误消息“字符串类型的参数不可分配给 never 类型的参数。”
    • 编辑为 callFake 而不是 returnValue。看看这个改变是否有效
    【解决方案2】:

    @PMO1948:你的建议让我朝着正确的方向前进。这是我必须做的: 而不是

    spyOn(myService, 'getDataSubject', 'get').and.returnValue(of(mockData));
    

    我调用了填充私有 BehaviorSubject 的源函数:

    myService.requestData().subscribe();
    

    然后我监视了那个函数:

    spyOn(myService, 'requestData').and.returnValue(of(mockData));
    

    所以在我的 ngOnInit 中,当订阅服务属性时,会返回 mockData。至少,这是我认为正在发生的事情,而且我的测试通过了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-22
      • 1970-01-01
      • 2014-10-23
      • 1970-01-01
      • 1970-01-01
      • 2015-11-30
      相关资源
      最近更新 更多