如何对服务中的 BehaviorSubject 变量进行单元测试,它是组件中的可观察对象

Posted

技术标签:

【中文标题】如何对服务中的 BehaviorSubject 变量进行单元测试,它是组件中的可观察对象【英文标题】:How to do Unit Testring of a BehaviourSubject variable in a service, it is an observable in a component 【发布时间】:2021-04-25 22:32:32 【问题描述】:

我正在尝试为组件中的变量(masters)编写测试用例,它是服务中的BehaviorSubject 变量。我无法找到编写测试用例的方法。以下是详细内容

// component code
export class MastersComponent implements OnInit, OnDestroy 
  destroy$: Subject<boolean> = new Subject<boolean>();
  masters: any[] = [];

  constructor(private masterService: MasterService)  

  ngOnInit()
    //.... some code here

    this.masterService.masters.pipe(
      takeUntil(this.destroy$))
      .subscribe(result => 
        this.masters = result;
      );

    //....some code here
    this.getMasters();
  

  // component method code
  getMasters() => 
    const paginationObject = 
      pageNo: this.pageIndex + 1,
      sizePerPage: this.sizePerPage,
      searchString: this.searchString,
      order: 'asc',
      orderBy: ['name'],
      repositoryId: this.repositoryId
    ;
    this.masterService.getMasters(paginationObject, alertError);
  

  ngOnDestroy() 
    this.masterService.masters.next([]);
    this.destroy$.next(true);
    this.destroy$.unsubscribe();
  


// service method code
masters: BehaviorSubject<Master[]> = new BehaviorSubject([]);

getMasters = (paginationObject, fail) => 
    this.resources.getMasters(paginationObject,
      (response) => 
        this.masters.next(response);
      , (response) => 
        this.masters.next([]);
        fail(response);
      );
  

【问题讨论】:

你到底想测试什么? 嗨,迈克,感谢您的回复。我正在尝试为在 MastersComponent 中声明的 masters 变量编写测试用例。但是这个变量是一个可观察的,它会在服务方法中得到更新。 【参考方案1】:

我认为你在组件的字段和服务的 observable 之间混合使用。

作为初学者,我建议您测试 ngOnInit 方法。这是大纲:

    为 MasterService 创建一个存根,它公开一个 masters Observable 和一个 getMasters 方法。这个存根方法实际上是作为 ngOnInit 的输入,所以你应该在其中放入任何你想测试的输入,例如空数据:“this.masters.next([])” 使用您的测试框架将此存根作为 MasterService 注入 调用 ngOnInit 断言该组件的 masters 变量等于 []

综上所述,我们设计了如下测试用例:给定空master作为外部服务输入,组件也用空master初始化。

的确,这是一个简单的测试(有些人会说没有必要),但它应该演示如何测试一个方法,该方法获取的输入不是作为参数(直接)而是作为依赖项(服务、间接)。

顺便说一句,服务也应该作为一个单独的单元进行测试:要模拟“资源”依赖项(间接输入),以便使用两个参数作为直接输入来测试 getMasters 方法。

【讨论】:

以上是关于如何对服务中的 BehaviorSubject 变量进行单元测试,它是组件中的可观察对象的主要内容,如果未能解决你的问题,请参考以下文章

使用 BehaviorSubject 的测试中的 TimeoutException - BLoC

将数组中的值附加到 BehaviorSubject

使用 BehaviorSubject 重新加载时的角度数据丢失

Angular2 中的 BehaviorSubject 不是第二次设置值?

延迟Rxjs BehaviorSubject机制

BehaviorSubject 和条件组件显示