0

好的,我正在尝试使用模拟框架自学测试,并且我在 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# 中通过,我的困惑是我做错了什么让测试忽略传递给伪造事件处理程序的参数?

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 回答