繁体   English   中英

在 MVP GWT 应用程序中测试演示者

[英]Testing Presenters in MVP GWT application

我有一个简单的应用程序,并希望使其可测试。 我是这个领域的新手。 这是一个简单的演示者,考虑到这段代码,你能给我建议或给我一些如何测试它的例子。

    public class SomePresenter extends Presenter<MainPanelPresenter.Display>
    {

    public interface Display extends WidgetDisplay
    {
      HasClickHandlers getAddButton();

      HasClickHandlers getDeleteButton();

      void setData(ArrayList<Person> data);

      ArrayList<String> getSelectedRows();

      Widget asWidget();

    }

    private final DispatchAsync dispatcher;
    public static final Place PLACE = new Place("main");

    @Inject
    public SomePresenter(DispatchAsync dispatcher, EventBus eventBus, Display display)
    {
      super(display, eventBus);
      this.dispatcher = dispatcher;
      bind();
    }

    protected void onBind()
    {
      display.getAddButton().addClickHandler(new ClickHandler()
      {
        public void onClick(ClickEvent event)
        {
          eventBus.fireEvent(new AddButtonEvent());
        }
      });

      display.getDeleteButton().addClickHandler(new ClickHandler()
      {
        public void onClick(ClickEvent event)
        {
          ArrayList<String> list = display.getSelectedRows();
          deletePerson(list);
        }
      });
    }
    ....
    private void loadDbData()
    {
     ..........
    }
    private void deletePerson(ArrayList<String> ids)
    {
     ..........
     }
   }

编辑:

Presenter 是什么,从数据库加载初始数据,有 2 个按钮添加和删除。 当按下添加时,会加载一个新表单,用户可以输入数据并保存到数据库,删除按钮只是从数据库中删除人员。

谢谢

对这样的 class 进行单元测试的一般思路是,就像任何其他 class 一样:

  • 创建依赖项的 Mock 版本(Display、EventBus 等...)
  • 设定当 Presenter 工作时,depdencies 应该做什么的期望
  • 锻炼 Presenter 并检查期望值

但是,您的 Presenter 版本存在一些问题:

  • 未显示 loadDbData() 方法,但我认为这意味着 Presenter 还可以访问其他一些执行获取的组件。 这个组件可以在依赖中抽象出来,并且像 rest 一样被嘲笑吗?

  • 然后是bind()的测试。 在此方法中,Presenter 的唯一职责是在 Display 提供的某些按钮上设置回调。 您要测试的是:

    • 回调已设置
    • 设置回调做预期的事情

一些有助于后期的想法:

您可以减少 Presenter 和 Button 之间的耦合。 如果可能,将显示界面从以下位置更改:

Button getAddButton();

addAddButtonClickedHandler(ClickHandler);

这意味着您的演示者不必使用返回实际按钮的显示 object

您可以将回调内容减少为调用单个方法,然后您可以单独测试

protected void bind() {
   display.addAddButtonClickHandler(new ClickHandler() {
       public void onClick(ClickEvent) {
          fireAdded();
       } 
   });
} 

// The fireAdded function can be tested independenty of the Display, potentially with 
// a mock EventBus
protected void fireAdded() {
   event.fireEvent(....)
}

如果您真的想检查回调是否设置正确,则可以使用 Display class 的“虚拟”实现,它为您提供所有回调的列表,并让您调用它们

private class DummyDisplay implements Display  {

   private List<ClickHandler> addButtonClickHandlers;
   public void addAddButtonClickHandler(ClickHandler handler) {
       addButtonClickHandlers.add(handler);
   }
   public void fireAddButtonClick() {
       for (ClickHandler h in addButtonClickHandlers) {
              h.onClick(new ClickEvent());
       }
   }
   // .... 
}

然后您的测试将:

  • 创建一个具有这种虚拟显示器的演示者
  • 使用 bind 设置回调
  • 使用 display.fireAddButtonClick() 模拟用户点击
  • 检查是否有点击的结果,可以看到 fireAdded 的效果

这种类型的 class(主要将其他类粘合在一起)往往很难测试; 在某些时候,如果其他课程经过彻底测试,那么专注于胶水而不是胶水可能会适得其反。

希望这会有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM