5

必要に応じて System.Windows.Forms.Form クラスに結合されているメソッドの単体テストに成功した人はいますか?

私は最近、C# winforms アプリケーションに取り組んでおり、MVC 構造でビルドしようとしています。フレームワークが実際にこれを念頭に置いて構築されていないことを考えると、これは十分に困難です。

ただし、単体テストをミックスに投入すると、さらに難しくなります。単体テストにスタブ/モックを使用できるように、コントローラーが具体的なビュー クラスに結合されていないことを確認してきました。ただし、どこかでForm クラスを参照することは避けられず、これらのメソッドをテストする必要があります。

私がMoqを使っているのは、Moqには優れた型安全機能があり、具体的な型をモックできるからです。しかし残念ながら、仮想でも抽象でもない具象型のメソッドまたはプロパティへの呼び出しを「期待」することはできません。Form クラスはサブクラス化を考慮して作成されていないため、これは大きな問題です。たとえば、ShowDialog を「期待」して、実際のウィンドウが作成されないように Form クラスをモックできるようにする必要があります。

そのため、フォームのサブクラスと多くのやり取りを行う単体テストを実行できません。これは私のビューです。

このタイプのコードの単体テストに成功した人はいますか? どうやってそれをしましたか?

これは、他のモッキング フレームワークで回避できるものですか? 他のモッキング フレームワークで使用される文字列ベースのメソッドは、同じ制約を受けますか? 独自の明示的なロングハンド モック クラスを記述できますか?それとも、仮想メンバーがないために、ウィンドウの動作をそのように抑制することができなくなりますか?

または、フォームに結合されたコードが単純な複雑さのメソッドとクラスになるように、クラスを構造化するために考えていなかった方法がありますか?それのための?

4

2 に答える 2

3

GUI 要素を使用した単体テストで聞いた/使用した最良の方法は、Humble Dialogパターン/方法です。本質的に、フォームは単なるインターフェースであり、実際の作業はすべて他のクラスで行われます。機能を提供するクラスを単体テストしてから、GUI イベントをそれらのクラスの適切なメソッドに関連付けるだけです。

于 2008-09-24T16:16:52.280 に答える
0

私の現在の考えでは、Form クラスとの継承ではなく、コンポジションを使用して、コントローラーをそれから分離する必要があるかもしれません。

これには、計画していなかった Form クラスのメンバーを使用する必要があるたびに、それをビュー インターフェイスに明示的に追加する必要があるという欠点があります。

于 2008-09-24T16:13:14.020 に答える