Как проверить пользовательский опыт в отношении длительных фоновых процессов в приложении Windows Forms? - PullRequest
1 голос
/ 01 октября 2010

Я занимаюсь разработкой приложения .NET для Windows Forms. Я использую шаблон дизайна модель-представление-презентер, контролирующий контроллер, если быть более точным.

Докладчики в моем приложении выполняют фоновые операции, что может занять несколько секунд (или дольше) для завершения. Когда фоновый процесс завершается, докладчик вызывает вызов в представлении, передавая все данные, необходимые для визуализации / обновления формы. Все это прекрасно работает.

Теперь я хочу проверить пользовательский интерфейс, в отношении этих длительных фоновых процессов. Например, я хочу посмотреть, как выглядит и ведет себя пользовательский интерфейс, когда работает один или несколько фоновых процессов.

Чтобы сделать это, я вставил несколько вызовов Thread.Sleep (..) в своих докладчиков, в окружении #IF DEBUG символа компиляции. Мне это не нравится, потому что это загромождает мой код, его трудно поддерживать, и он может легко попасть в рабочий код.

Есть ли у вас лучшее решение для тестирования пользовательского опыта? в отношении длительных фоновых процессов в приложении winforms?

1 Ответ

0 голосов
/ 06 октября 2010

Мне все еще интересны любые ответы, но сейчас я опубликую свое текущее решение.

Вместо того, чтобы запускать фоновый процесс из докладчика, докладчик теперь передает его в ActionManager.1003 *

Если я хочу протестировать UX, я запускаю приложение с ActionManager с задержкой в ​​одну секунду перед выполнением команды.Это позволяет мне проверять поведение пользовательского интерфейса.

Это решает мою проблему.Докладчики теперь выглядят примерно так:

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 method
    private void UpdateViewWith(Item[] newItems)
    {
        _syncCtxt.Post(state => _view.AddResults(newItems), newItems);
    }

    // ...
}
...