[英]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 一樣:
但是,您的 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());
}
}
// ....
}
然后您的測試將:
這種類型的 class(主要將其他類粘合在一起)往往很難測試; 在某些時候,如果其他課程經過徹底測試,那么專注於膠水而不是膠水可能會適得其反。
希望這會有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.