作成する必要がある既存の WinForms アプリケーションのフォームを使用して、初めて TDD を適用しようとしています。「C# におけるアジャイルの原則、パターン、およびプラクティス」を読みました。ここから、TDD に関する私の知識のほとんどが得られました。
この本の中で、著者は、View と Model に依存する Presenter を持つ Supervising Presenter と呼ばれる MVP のわずかに変更された形式で UI 開発を行うことを推奨しています。これにより、Presenter のコードがどのように見えるかが気に入っています。説明のために、簡単な例を次に示します。
class Presenter
{
Public IDomainApi _api;
Public IView _view;
...
public void PerformOperation()
{
bool userDecidesToPerformOperation = _view.PromptUserToConfirmOperation();
if( userDecidesToPerformOperation )
{
bool success = _api.PerformOperation();
if( success)
_view.AlertUserOperationSuccessful();
else
_view.AlertUserOperationFailed();
}
}
}
これはすべてうまく機能します。テスト目的で、私は mockIDomainApi
とmock を持っていIView
ます。コントローラーの寿命が良好であることを確認できました。
実際のアプリケーション_api
は、IDomainApi
ネットワーク上で機能する の実際の実装であり、必要なすべての制御を実装_view
する のインスタンスです。Form
IView
realIDomainApi
が実行する一部の操作には時間がかかるため、Presenter メソッドを少し変更して、ユーザーに処理が行われていることを警告することにしました。プレゼンターは次のように変更されました。
public void PerformOperation()
{
bool userDecidesToPerformOperation = _view.PromptUserToConfirmOperation();
if( userDecidesToPerformOperation )
{
_view.NotifyPendingOperation("Performing operation ...");
bool success = _api.PerformOperation();
_view.PendingOperationCompleted();
if( success)
_view.AlertUserOperationSuccessful();
else
_view.AlertUserOperationFailed();
}
}
新しいメソッドを「実際の」IView
実装に追加しました。渡されたテキストと、アクティビティを示すように設定された進行状況バー (マーキー設定) を含む単純なダイアログ ボックスが表示されるだけです。Presenter
悲しいことに、テスト中に、実行中のスレッドが UI スレッドであるため (および_api.PerformOperation()
完了を待ってブロックされているため) 、ダイアログの進行状況インジケーターがアクティブになっていないことがわかりました。
Presenter
を作成および使用して別のスレッドで呼び出すコードを変更しようとしPresenter
ましたが、UI が正しくレンダリングされません (レンダリングは UI スレッドでのみ行われ、新しいスレッドでは行われません)。この問題を解決するには、拡張IView
して UI スレッドを公開し、そのスレッドで適切なメソッドを呼び出せるようにする必要IView
がありますが、これは Presenter コードを醜くし、WinForms に依存させるようです。この種のことを処理するためのより良い方法を見つけた人はいますか? これまでのところ、オンラインで検索すると、主に Web を使用した TDD に関する情報が得られる傾向があります。WinForms に固有のこれらのことのいくつかを実行する方法に関する優れたリソースを知っている人はいますか?