3

私は現在、NSubstitute をモック フレームワークとして使用していますが、1 つの例外を除いて、かなりうまくやっています...

モックされたオブジェクト内からイベントを呼び出すインタラクションをモックしようとしていますが、残念ながらこれを行うのに本当に苦労しています。設定はこんな感じ…

Public Interface IMockObject
    Event MyMockedEvent( someId as Integer )
    Sub MyRoutineThatInvokesMyMockedEvent( someId as Integer)
End Interface

...私の単体テストでは、'MyRoutineThatInvokesMyMockedEvent' をモックして ID を受け取り、'MyMockedEvent' を発生させる必要があります。これまでのところ、私は思いついた...

Dim mockedObject = Substitute.For(Of IMockObject)()
mockedObject.When(
    Sub(x) x.MyRoutineThatInvokesMyMockedEvent( 999 )).Do( 
        Sub(y) 'RaiseTheEventHere )

...しかし、実際には次の無効なイベントを発生させることに固執しています...

mockedObject.When(
    Sub(x) x.MyRoutineThatInvokesMyMockedEvent( 999 )).Do( 
        Sub(y) RaiseEvent MyMockedEvent(999) )

...これは VB.NET では (ヘルパー ルーチンを作成せずに) 不可能であるという理論がありますが、ヘルパー ルーチンを使用せずに上記を達成する方法についての助けを喜んでいただければ幸いです。

4

1 に答える 1

1

OK、答えが見つかりました。またはそのようなもの。

私が信じている問題は、使用されているイベント定義によるものです。「MyMockedEvent」を再構成して独自の「MyMockedEventArgs」(System.EventArgs から継承) を使用することにより、不適切な型を通過することについて不平を言うことなくイベントを発生させることができます。

mockedObject.When(
    Sub(x) x.MyRoutineThatInvokesMyMockedEvent( 999 )).Do( 
        Sub(y) RaiseEvent IMockObject.MyMockedEventEventHandler() )

しかし、ここで、VB.NET が舞台裏でイベントのデリゲートを作成することを認識しているため、VB.NET が何らかの黒魔術を行っているのではないかと疑っています。もちろん、Intellisense が EventHandler を表示しないという事実も特に役に立ちません。デリゲートを手動でコーディングできると思いますが、このアプローチの方が速いようです。

HTH

于 2012-08-16T11:59:55.083 に答える