即使有 DoNotCallBase,Nsubstitute 在 When 中调用方法
Nsubstitute Calls Method in When even though there is DoNotCallBase
我正在部分模拟具有这两种方法的 class:
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 : Argument cannot be null or empty Parameter name: connectionId
我有点迷茫,因为我对这两种方法做了完全相同的事情并得到了不同的行为,为什么我的 when 方法调用 EmitTo
?
NSubstitute 与大多数模拟框架一样只能拦截对 virtual
方法的调用。它能够停止对 Broadcast
的调用,因为它是虚拟的。如果你想停止调用它,你需要使 EmitTo
虚拟。必须是:
public virtual void EmitTo(string connectionId, ChatMessage message)
{
Clients.Client(connectionId).broadcastMessage(message.User.UserName, message.Message);
}
我正在部分模拟具有这两种方法的 class:
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 : Argument cannot be null or empty Parameter name: connectionId
我有点迷茫,因为我对这两种方法做了完全相同的事情并得到了不同的行为,为什么我的 when 方法调用 EmitTo
?
NSubstitute 与大多数模拟框架一样只能拦截对 virtual
方法的调用。它能够停止对 Broadcast
的调用,因为它是虚拟的。如果你想停止调用它,你需要使 EmitTo
虚拟。必须是:
public virtual void EmitTo(string connectionId, ChatMessage message)
{
Clients.Client(connectionId).broadcastMessage(message.User.UserName, message.Message);
}