如何对位于私有函数内部的按钮点击事件进行单元测试?

3

我有一个服务中的私有函数,看起来像这样。如何编写该按钮的单元测试click事件?该按钮位于对话框内。

1)那能进行单元测试吗? 2)由于我提到了这是在一个服务中,点击事件也涉及其中,所以应该像组件一样进行测试吗?这意味着我必须设置TestBed,以便实际点击该按钮,如果是,如何操作?或者是否有更正确的方法来编写它的单元测试,如何操作?

谢谢!

public callOpenDialog(){
   openDialog(formA, dataView, {}, true);
}
private openDialog(formA: FormA, dataView: DataView, placeholder: ViewContainerRef, okToAll: boolean): Observable<ResponseRequiredResult> {
    return new Observable<ResponseRequiredResult>(observer => {
      let dlgComponent: ResponseRequiredModalFormComponent;
      let dialog: DialogRef<ResponseRequiredModalFormComponent>;
      const dialogId = 'ResponseRequired';

      let buttons = [
        {
          id: this.lmUniqueIdService.uniqueId([formA.busFormA.name, dialogId, DialogButtonKey.OK]),
          text: Locale.translate(DialogButtonKey.OK),
          validate : false,
          isDefault: true,
          click: (e, modal) => {
            if (this.validateResponseRequiredForm(formA.busFormA, dlgComponent.formComponent.formModel)) {
              dialog.close(<ResponseRequiredResult> {
                result:     ResponseRequiredDialogResult.RESPONSE_OK,
                specFields: formA.busFormA.fields, model: dlgComponent.formComponent.formModel
              });
            }
          }
        }
      ];

     dialog = modalDialogService
      .modal(ResponseRequiredModalFormComponent, placeholder)
      .buttons(buttons)
      .title(Locale.translate('ResponseRequired'))
      .isAlert(true)
      .open();
}

你可以将 click 回调函数提取到自己的函数中并测试该函数。你不需要测试点击的触发,这应该在 ModalDialogServiceResponseRequiredModalFormComponent 中进行测试。 - AntoineB
@AntoineB 我该如何提取它? - user3714598
只需将其作为常规函数放置在组件上并传递它,而不是在打开对话框时使用匿名函数。 - AntoineB
@AntoineB 除了更改组件之外,还有其他方法吗?我不想调整组件,只是为了编写特定代码部分的单元测试。 - user3714598
你想要测试什么?似乎没有任何有效的理由需要这是一个匿名函数。 - theMayer
2个回答

4

这段代码结构混乱,需要重写以便进行测试。当前的结构中,该代码完全无法进行测试。存在以下问题:

  1. 单击操作在两个匿名方法内部执行。
  2. 可观察对象没有返回任何值(在对话框打开后),因此无法从中获取按钮数组。

如果您需要能够测试代码,则需要将它们声明为组件上的方法或更新代码以返回按钮数组(更好的做法是一个具有所需上下文的完整类)。


4
你可以从单元测试中调用私有函数,不应该依赖于点击事件。
service = TestBed.get(PushNotificationService);
service['openDialog'](a, b, c, d);

只需使用方括号调用私有函数并正常传递参数。我在我的代码库中的许多地方都使用了它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接