Lom*_*ani 6 c# nunit unit-testing mocking 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);
}
Run Code Online (Sandbox Code Playgroud)
在我的测试中,[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();
Run Code Online (Sandbox Code Playgroud)
我Broadcast在调用该方法时调用此行或稍后调用没有问题(它们没有按预期执行任何操作)但奇怪的是我的第三行抛出错误:
System.ArgumentException:参数不能为null或为空参数名称:connectionId
我有点迷失,因为我对两种方法做了完全相同的事情并获得了不同的行为,为什么我的when方法调用EmitTo?
像大多数模拟框架一样,NSubstitute只能拦截对virtual方法的调用.它能够停止呼叫Broadcast,因为它是虚拟的.EmitTo如果要阻止它被调用,则需要创建虚拟.它需要是:
public virtual void EmitTo(string connectionId, ChatMessage message)
{
Clients.Client(connectionId).broadcastMessage(message.User.UserName, message.Message);
}
Run Code Online (Sandbox Code Playgroud)