1

サービス クラスとアクション クラスがあり、イベントがトリガーされるとアクションが発生します。したがって、サービスクラスでイベントをテスト登録することは重要です。

Rhino Mock テストの RegisterEvent 関数を使用しようとしましたが、テスト パスを作成できず、AssertWasCalled は常に失敗します。

誰かが私にいくつかのガイダンスや記事のリンクを教えていただければ幸いです。

public class ServiceClass
{
    public ActionClass Printer {set; get;}
    public void RegisterEvent()
    {
        Printer = new ActionClass ();
        Printer.PrintPage += Printer.ActionClass_PrintPage;
    }
}
public class ActionClass
{
    event PrintPageEventHandler PrintPage;
    public void ActionClass_OnAction( object sender, PrintPageEventArgs e )
    {
        // Action here.
    }
}
[Test]
public void RegisterEvent_Test()
{
    var service = new ServiceClass();

    var mockActionClass = MockRepository.GenerateMock<IActionClass>();

    service.Printer = mockActionClass;
    service.RegisterEvent();
    mockActionClass.AssertWasCalled( x => x.PrintPage += Arg<PrintPageEventHandler>.Is.Anything );
}
4

3 に答える 3

1

変化する

Arg<EventHandler>.Is.Anything 

Arg<EventHandler<YourEventArgTypeName>>.Is.Anything
于 2013-06-17T09:04:50.910 に答える
1

あなたの問題は別の場所にあります-テストで1つのセットを上書きRegisterEventする新しいインスタンスを作成します。ActionClassテストに合格するには、そのインスタンス化行を から削除するだけですRegisterEvent:

public void RegisterEvent()
{
    // This overrides mock you set in test
    // Printer = new ActionClass ();
    Printer.PrintPage += Printer.ActionClass_PrintPage;
}
于 2013-06-17T10:37:20.477 に答える
0

@jimmy_keen のおかげで私の間違いが見つかりました。現在、2 つの有効なアサーションがあります。

これは実用的なソリューションです...

public class ServiceClass
{
    public IActionClass Printer {set; get;}
    public void RegisterEvent()
    {
        Printer.PrintPage += ActionClass_PrintPage;
    }
}
public class ActionClass : IActionClass 
{
    event PrintPageEventHandler PrintPage;
    public void ActionClass_PrintPage( object sender, PrintPageEventArgs e )
    {
        // Action here.
    }
}
[Test]
public void RegisterEvent_Test()
{
    var service = new ServiceClass();

    var mockActionClass = MockRepository.GenerateMock<IActionClass>();

    service.Printer = mockActionClass;
    service.RegisterEvent();
    mockActionClass.AssertWasCalled(x => x.PrintPage += Arg<PrintPageEventHandler>.Is.Anything); // This does work. Credit to @jimmy_keen
    //mockActionClass.AssertWasCalled(x => x.PrintPage += Arg<EventHandler<PrintPageEventArgs>>.Is.Anything); // Can not compile.
    mockActionClass.AssertWasCalled(x => x.PrintPage += x.ActionClass_PrintPage); // This works.
}
于 2013-06-17T11:23:37.603 に答える