即使有DoNotCallBase

时间:2015-05-22 10:22:04

标签: c# unit-testing mocking nunit nsubstitute

我正在嘲笑一个有这两种方法的类:

public void EmitTo(string connectionId, ChatMessage message)
{
    Clients.Client(connectionId).broadcastMessage(message.User.UserName, message.Message);
}

public virtual void Broadcast(ChatMessage message)
{
    Clients.All.broadcastMessage(message.User.UserName, message.Message);
}

在我的测试中[SetUp]我有这些电话:

hub = Substitute.ForPartsOf<ChatHub>(myMockedClient, context, groupManager);
hub.When(x => x.Broadcast(Arg.Any<ChatMessage>())).DoNotCallBase();
hub.When(x => x.EmitTo(Arg.Any<string>(), Arg.Any<ChatMessage>())).DoNotCallBase();

我在此行上调用Broadcast时没有问题,或者稍后我调用该方法时没有问题(他们没有按预期执行任何操作)但奇怪的是我的第三行引发了错误:

  

System.ArgumentException:参数不能为null或为空参数名称:connectionId

我有点迷失,因为我对两种方法做了完全相同的事情并得到了不同的行为,为什么我的when方法调用EmitTo

1 个答案:

答案 0 :(得分:9)

像大多数模拟框架一样,NSubstitute只能拦截对virtual方法的调用。它可以停止对Broadcast的呼叫,因为它是虚拟的。如果要阻止它被调用,则需要使EmitTo为虚拟。它必须是:

public virtual void EmitTo(string connectionId, ChatMessage message)
{
    Clients.Client(connectionId).broadcastMessage(message.User.UserName, message.Message);
}