モック フレームワークを使用したテストを独学で学ぼうとしています。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# にも渡されます。偽のイベント ハンドラーに渡された引数をテストで無視するようにするには、何が間違っているのでしょうか?