0

モック フレームワークを使用したテストを独学で学ぼうとしています。VB.NET で作業しています。ラムダ式は初めてで、以前のアプリケーションはすべてバージョン 2005 以前で作成されています。今は 2010 です。Rhino.Mocks を試してみましたが、主に構文が古いため、理解するのが難しいことがわかりました。最近、誰も VB.NET でブログを書いているようには見えないので、私は C# の例を見て、何が起こっているのかを理解しようとしています。

そのため、クラスのコンストラクターにインターフェイスを渡し、そのインターフェイスへの参照を保持する状況があります。オブジェクトでメソッドが呼び出され、インターフェイスを実装するクラスによって処理されるイベントが発生した場合。

困っていたので、C# で簡単なバージョンを作成し、vb.net で手順を繰り返してみました。

だから私のインターフェース:

public interface IBroadcastClient
{
   void MessageReceivedHandler(string msg);
}

イベントを発生させるクラス:

public class Broadcaster
{     
    public Broadcaster(IBroadcastClient c)
    {
        _client= c;
        this.SendMessage += new MessageReceived(_client.MessageReceivedHandler);
    }
    private IBroadcastClient _client;


    public event MessageReceived SendMessage;

    public void SendMessageNow()
    {
        string _Message;
        if (SendMessage != null)
        {
            _Message = @"Yay!";
            SendMessage(_Message);
        }
    }
}

テスト:

[TestMethod]
public void TestSendMessageWithIgnoreParameter()
{
    //string msg = @"Yay!";
    var client = A.Fake<IBroadcastClient>();
    Broadcaster b = new Broadcaster(client);
    b.SendMessageNow();
    A.CallTo(() => client.MessageReceivedHandler(A<string>.Ignored)).MustHaveHappened();
}

これで合格、今のところ問題ありません。

vb.net で同じことを試してみましょう。C# ではなく vb.net 内の同じインターフェイスとブロードキャスター クラスで、最初は単体テストに続いています。

<TestMethod()>
Public Sub TestMethod1()
    Dim client = A.Fake(Of IBroadcastClient)()
    Dim b As New Broadcaster(client)
    b.SendMessageNow()
    NextCall.To(client).MustHaveHappened()
    client.MessageReceivedHandler(A(Of String).Ignored)

End Sub

これは失敗し、次のエラー メッセージが表示されます。" 次の呼び出しでアサーションが失敗しました: TestFakeItEasyVB.IBroadcastClient.MessageReceivedHandler(msg: ) 少なくとも 1 回は見つかると予想されていましたが、呼び出しの中で #0 回見つかりました: 1: TestFakeItEasyVB.IBroadcastClient.MessageReceivedHandler(msg: "Yay!")"

おかしなことに、このように書いています。

<TestMethod()>
Public Sub TestMethod3()
    Dim client = A.Fake(Of IBroadcastClient)()
    Dim b As New Broadcaster(client)
    b.SendMessageNow()
    A.CallTo(Sub() client.MessageReceivedHandler(A(Of String).Ignored)).MustNotHaveHappened()


End Sub

も同じエラー メッセージで失敗しますが、このバージョンのテストはパスします。

<TestMethod()>
Public Sub TestMethod2()
    Dim client = A.Fake(Of IBroadcastClient)()
    Dim b As New Broadcaster(client)
    b.SendMessageNow()
    NextCall.To(client).MustHaveHappened()
    client.MessageReceivedHandler("Yay!")

End Sub

このバリエーションは C# にも渡されます。偽のイベント ハンドラーに渡された引数をテストで無視するようにするには、何が間違っているのでしょうか?

4

1 に答える 1

0

NextCall 構文は従来の理由から存在します。式構文を使用することをお勧めします。

A.CallTo(Sub() client.MessageReceivedHandler(A(Of String).Ignored)).MustNotHaveHappened()

あなたのテストでは、他のすべてのテストには MustHaveHappened がありますが、この特定のテストには MustNotHaveHappened があります。それがあなたのテストが失敗した理由だと思います。コードをコンパイルして実行し、MustHaveHappened に変更すると、テストに合格します。

現在、VB 固有の「NextCall」構文で引数の制約を使用することはできません。ただし、「WhenArgumentsMatch」メソッドを使用して、最初のテストを次のように書き直すことができます。

<TestMethod()>
Public Sub TestMethod1()
    Dim client = A.Fake(Of IBroadcastClient)()
    Dim b As New Broadcaster(client)
    b.SendMessageNow()
    NextCall.To(client).WhenArgumentsMatch(Function(a) a.Get(Of String)(0) = "Yay!").MustHaveHappened()

    client.MessageReceivedHandler(Nothing)
End Sub

または、拡張機能「WithAnyArguments」を使用してすべての引数を無視することもできます。

<TestMethod()>
Public Sub TestMethod1()
    Dim client = A.Fake(Of IBroadcastClient)()
    Dim b As New Broadcaster(client)
    b.SendMessageNow()
    NextCall.To(client).WithAnyArguments().MustHaveHappened()

    client.MessageReceivedHandler(Nothing)
End Sub
于 2011-04-16T13:08:05.623 に答える