4

winform コントロールにアクセスするメソッドをテストすることは可能ですか? 次のメソッドは、フォームの一連のコントロールの Enabled プロパティにアクセスします。残念ながら、これを単体テストする方法がわかりません/可能かどうか。

いくつかの指針を本当に感謝します。

    public void AccessToCsvFileVerificationInputs(bool access)
    {
        btnSelectCSVFilePath.Enabled = access;
        nudNumberOfColumns.Enabled = access;
        cbCurrencyPair.Enabled = access;

        foreach (Control input in tlpColumnDataTypes.Controls)
        {
            input.Enabled = access;
        }

        foreach (Control input in tlpColumnNames.Controls)
        {
            input.Enabled = access;
        }

        nudInitialRow.Enabled = access;
        nudFinalRow.Enabled = access;

        btnSelectErrorLogFilePath.Enabled = access;
    }
4

1 に答える 1

6

これに対する最善のアプローチは、アプリケーションの設計を何らかの形式の Model-View-* パターンに移行することであることがわかりました。Winforms のModel-View-Presenter 1は通常、適切なパターンです。

このようにして、すべてのロジックを担当するプレゼンター/コントローラー クラスがあり、UI コードを保持するビューがあります。Winforms では、通常、フォーム クラスに、できることすべてを定義する IView インターフェイスを実装させることで、これを実現します。

次に、フォームを (インターフェースとして宣言して渡す) フォームをプレゼンターに提供します - コンストラクター依存性注入は、それを渡す典型的な方法です。


したがって、この例では、AccessToCsvFileVerificationInputsメソッドをプレゼンター クラスに移動し、正しいインターフェイスを実装するフォームのインスタンスをプレゼンターに渡し、そのフォームが実行できるすべてのことを伝えます。

このようなもの:

public class CsvFilePresenter
{
    private ICsvFileView view_;
    public CsvFilePresenter(ICsvFileView view)
    {
        view_ = view;
    }

    public void AccessToCsvFileVerificationInputs(bool access)
    {
        // Code omitted for brevity
    }
}

コントロールなどの UI 機能を直接参照するメソッドでは、代わりにインターフェイスを参照します。

public void AccessToCsvFileVerificationInputs(bool access)
{
    view_.EnableSelectCSVFilePath = access;
    view_.EnableNumberOfColumns = access;
    view_.EnableCurrencyPair = access;

    // And so on...
}

私は意図的にコントロール コレクションを除外しました。これらをどのように処理するかは、詳細によって異なります。

たとえば、次の ICsvFileView インターフェイスがあります。

public interface ICsvFileView 
{
    bool EnableSelectCSVFilePath { get; set; }
    bool EnableNumberOfColumns { get; set; }
    bool EnableCurrencyPair { get; set; }        
}

この ICsvFileView の具体的な実装は次のようになります。

public partial class Form3 : Form, ICsvFileView
{
    public Form3()
    {
        InitializeComponent();
    }

    bool ICsvFileView.EnableSelectCSVFilePath
    {
        get
        {
            return btnSelectCsvFilePath.Enabled;
        }
        set
        {
            btnSelectCsvFilePath.Enabled = value;
        }
    }

    bool ICsvFileView.EnableNumberOfColumns
    {
        get
        {
            return nudNumberOfColumns.Enabled;
        }
        set
        {
            nudNumberOfColumns.Enabled = value;
        }
    }

    bool ICsvFileView.EnableCurrencyPair
    {
        get
        {
            return cbCurrencyPair.Enabled;
        }
        set
        {
            cbCurrencyPair.Enabled = value;
        }
    }
}

これで、インターフェイスのモック化されたインスタンスを渡し、そのモックに期待値を設定することで、ロジックの動作 (プレゼンターによって表現された) とビューとの相互作用をテストできます。


これらすべてが少し複雑で複雑に思える場合は、それが原因であることに注意してください。Winforms は、この種のことを念頭に置いて実際に設計されたわけではありません.WPF などの他のフレームワークは、このすべてをはるかに簡単にします. 変更できるのであれば、検討することをお勧めします。


1私がリンクした Web ページの Martin Fowler は、このパターンを廃止し、さらに 2 つの異なるパターンに移行しました。用語はよく知られているため、そのまま使用します。彼の新しいパッシブ ビューは、私がいつも見てきた MVP に近いものです。

于 2012-08-04T17:36:49.927 に答える