より具体的には、単体テストで SaveFileDialog のFileOkイベントをトリガーして、自分のコード (SFD をラップし、ShowDialog の前後にいくつかの追加処理を行う) が意図したとおりに機能するかどうかをテストする必要があります。
これについて何か助けてくれてありがとう。
問題は、イベントが「raise」操作を公開しないことです* - それらは「subscribe」と「unsubscribe」を公開します。サブスクライブ/サブスクライブ解除をどのように実装するかは、実装次第です。
ただし、SaveFileDialog
(または任意FileDialog
の)の場合OnFileOk
、イベントを発生させる保護されたメソッドがあります。リフレクションを使用して呼び出すか、単に呼び出すpublic メソッドから派生させて公開することができますSafeFileDialog
。次に、 のイベント ハンドラが呼び出されます。これらの攻撃計画のどちらが特に好きかはわかりませんが、あなたが何をしようとしているのかについての詳細がなければ、あまり質問するのではなく、質問に答えるだけだと思いました:)OnFileOk
OnFileOk
FileOk
*
実際、.NET 自体には、イベントの "raise" 部分の概念があるため、EventInfo.GetRaiseMethod
. ただし、これはイベント IMO の一般的な考え方に反しており、C# コンパイラはレイズ部分を生成しません。標準ライブラリも通常それを公開しているとは思いません。
SaveFileDialog をインターフェイスの背後に隠すと、スタブまたはモック実装を使用してコードをテストできます。単体テストで実際のフォームやコントロールを使用することはお勧めしません。それらのほとんどは、アクティブなメッセージ ループに強く依存しているためです。
public interface ISaveFileDialog
{
event CancelEventHandler FileOk;
}
public class SaveFileDialogStub : ISaveFileDialog
{
public event CancelEventHandler FileOk;
public void RaiseFileOk(CancelEventArgs e)
{
FileOk(this, e);
}
}
public class ClassUnderTest
{
public ClassUnderTest(ISaveFileDialog dialog)
{
dialog.FileOk += OnFileOk;
}
void OnFileOk(object sender, CancelEventArgs e)
{
//...
}
}
PrivateObjectを使用して、クラスでプライベート/保護されたメソッドを呼び出すことができると思います。