【发布时间】:2011-04-16 21:34:27
【问题描述】:
好的,我正在尝试使用模拟框架自学测试,并且我在 VB.NET 中工作,我是 lambda 表达式的新手,我之前的所有应用程序都是在 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 中尝试同样的方法; 相同的接口和广播器类,只是在 vb.net 而不是 C# 中,最初是 hte 以下单元测试。
<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: ) 预计至少会找到一次,但在调用中发现 #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# 中通过,我的困惑是我做错了什么让测试忽略传递给伪造事件处理程序的参数?
【问题讨论】:
-
在您的 TestMethod3 中您指定“MustNotHaveHappened”,但在其他测试中您有“MustHaveHappened”,我想这是错误吧?
标签: vb.net fakeiteasy