Testando apresentadores no aplicativo MVP GWT

9

Eu tenho um aplicativo simples e quero torná-lo testável. Eu sou novo nesta área. Aqui está um apresentador simples, tendo em mente este código, você poderia me aconselhar ou me dar algum exemplo de como testá-lo.

    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)
    {
     ..........
     }
   }

Editar:

O que é o apresentador, carregar dados iniciais do banco de dados, ter 2 botões adicionar e excluir. Quando add é pressionado, um novo formulário é carregado e o usuário pode inserir dados e salvar no banco de dados. delete button apenas delete a pessoa do db.

Obrigado

    
por adgfs 07.07.2011 в 16:04
fonte

1 resposta

5

A ideia geral de testes unitários de tal classe seria, como para qualquer outra classe:

  • cria versão Mock das dependências (Display, EventBus, etc ...)
  • definir expectativas sobre o que as dependências devem fazer quando o Presenter funciona
  • exercitar o apresentador e verificar as expectativas

No entanto, existem alguns problemas com sua versão do Apresentador:

  • O método loadDbData () não é mostrado, mas assumi que significa que o apresentador também tem acesso a algum outro componente que faz a busca. Esse componente pode ser extraído em uma dependência, e zombado gostou do resto?

  • Depois, há o teste de bind (). A única responsabilidade do seu apresentador nesse método é configurar retornos de chamada em alguns botões fornecidos pelo monitor. O que você quer testar é ambos:

    • Que os retornos de chamada estão definidos
    • Que os retornos de chamada configurados fazem as coisas esperadas

Algumas ideias para ajudar no futuro:

Você pode reduzir o acoplamento entre o Presenter e o Button. Se possível, altere a interface de exibição de:

Button getAddButton();

para

addAddButtonClickedHandler(ClickHandler);

Isso significa que o apresentador não precisa usar um objeto Display que retorne BUtton real

Você pode reduzir o conteúdo das chamadas de retorno para chamar um único método, que pode ser testado isoladamente

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(....)
}

Se você realmente deseja verificar se os retornos de chamada estão configurados corretamente, então você pode usar uma implementação 'Dummy' da classe Display, que fornece uma lista de todos os retornos de chamada e permite chamá-los

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());
       }
   }
   // .... 
}

Então o seu teste seria:

  • crie um apresentador com essa exibição fictícia
  • use bind para definir os retornos de chamada
  • use display.fireAddButtonClick () para simular um usuário clicando em
  • verifique se tem o resultado do clique, os efeitos do fireAdded são vistos

Esse tipo de classe (que geralmente cola outras classes) pode ser difícil de testar; em algum momento, as outras classes são exaustivamente testadas e podem se tornar um pouco contraproducentes, concentrando-se nos gluers, e não nos colados.

Esperando que isso ajude.

    
por phtrivier 09.07.2011 / 19:19
fonte