【问题标题】:Nsubstitute Calls Method in When even though there is DoNotCallBase即使有DoNotCallBase,Nsubstitute Calls Method in When
【发布时间】:2015-08-04 07:53:38
【问题描述】:

我正在部分模拟具有这两种方法的类:

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 : 参数不能为空或空参数名称:connectionId

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

【问题讨论】:

    标签: c# unit-testing mocking nunit nsubstitute


    【解决方案1】:

    像大多数模拟框架一样,NSubstitute 只能拦截对virtual 方法的调用。它能够停止对Broadcast 的调用,因为它是虚拟的。如果你想阻止它被调用,你需要将EmitTo 设为虚拟。它必须是:

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

    【讨论】:

    • 我太专注于其余的事情,我错过了基本的,非常感谢。
    • 已经给出了正确答案,但我也想为其他用户添加指向文档的链接:nsubstitute.github.io/help/partial-subs
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-20
    • 1970-01-01
    • 1970-01-01
    • 2022-12-02
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    相关资源
    最近更新 更多