views:

34

answers:

1

I'm developing a .NET Windows Forms application. I use the model-view-presenter design pattern, passive view + supervising controller, to be more exact.

The presenters in my application perform background operations, which can take several seconds (or longer) to complete. When the background process completes, the presenter invokes a call on the view, passing it all the data it needs to render / update the form. This all works nicely.

Now, I want to be able to test the user experience, with regard to these long-running background processes. For instance, I want to see how the UI looks and behaves, when one or more background processes are running.

To do this, I put some Thread.Sleep(..) calls in my presenters, surrounded by an #IF DEBUG compilation symbol. I don't like this, because it clutters my code, it is hard to maintain and can easily leak into production code.

Do you have a better solution for testing the user experience with regard to long running background processes in a winforms application?

A: 

I'm still interested in any answers, but for now I'll post my current solution.

Instead of starting a background process from within the presenter, the presenter now delegates this to an ActionManager.

If I want to test the ux, I run the application with an ActionManager that has a one-second delay before executing the command. This allows me to inspect the behavior of the ui.

This solves my problem. The presenters now look something like this:

internal class ItemListPresenter : IItemListPresenter
{
    // member variables 
    // ...
    public ItemListPresenter(IItemListView itemListView, IActionManager cmdManager)
    {
        _view = itemListView;
        _mngr = cmdManager;
        _syncCtxt = SynchronizationContext.Current; // let's assume we're constructed from the UI thread.
    }

    // IItemListPresenter method:
    public void StartLoadingItemsSession()
    {
        ShowBusy();
        ClearResults();
        _mngr.Post(LoadItems);
    }

    // ...

    private void LoadItems()
    {
        UpdateViewWith(GetItems());
        SetReady();
    }

    // ...
    // IItemListView mehtod
    private void UpdateViewWith(Item[] newItems)
    {
        _syncCtxt.Post(state => _view.AddResults(newItems), newItems);
    }

    // ...
}
Marijn
And this solution has better sep. of concerns, to I think.
Marijn