You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用NSubstitute结合委托时,如何检查已接收调用?

用NSubstitute检查委托的已接收调用

其实用NSubstitute验证委托的调用和验证接口的思路本质是一致的,只是因为委托本身是可调用类型,验证时需要通过Invoke()方法来明确检查调用行为,下面给你几种常见场景的示例:

1. 验证Action类型委托的调用

比如我们有一个接受Action<string>委托的方法,要确认这个委托是否被调用以及调用参数:

void Main()
{
    // 创建Action<string>的替代实例
    var logAction = Substitute.For<Action<string>>();
    
    // 执行测试方法
    ProcessLog(logAction);
    
    // 检查委托是否被传入指定参数调用过
    logAction.Received().Invoke("User logged in");
}

public void ProcessLog(Action<string> logHandler)
{
    // 这里是委托的实际调用
    logHandler("User logged in");
}

如果注释掉logHandler("User logged in");这行代码,同样会抛出ReceivedCallsException,提示未匹配到预期的委托调用。

2. 验证带返回值的Func类型委托

对于带返回值的Func<TInput, TOutput>委托,除了可以验证调用,还能预先设置返回值:

void Main()
{
    var calculateFunc = Substitute.For<Func<int, int>>();
    // 预先设置委托的返回值
    calculateFunc(10).Returns(20);
    
    var result = CalculateDouble(calculateFunc);
    
    // 验证委托是否被传入10调用过
    calculateFunc.Received().Invoke(10);
    // 也可以验证返回值是否符合预期
    Console.WriteLine(result); // 输出20
}

public int CalculateDouble(Func<int, int> calculator)
{
    return calculator(10);
}

3. 验证自定义委托

如果是你自己定义的委托类型,验证方式也是一样的,通过Invoke()方法检查:

// 自定义委托
public delegate void NotificationDelegate(string message, bool isUrgent);

void Main()
{
    var notifyDelegate = Substitute.For<NotificationDelegate>();
    
    SendNotification(notifyDelegate);
    
    // 检查自定义委托是否被传入指定参数调用
    notifyDelegate.Received().Invoke("System update available", true);
}

public void SendNotification(NotificationDelegate notifier)
{
    notifier("System update available", true);
}

核心要点

不管是系统内置的Action/Func还是自定义委托,NSubstitute都是通过拦截委托的Invoke()方法来追踪调用的,所以验证时必须通过Received().Invoke(...)来指定预期的调用参数和次数(如果需要指定次数,比如Received(2)就是检查是否被调用2次)。

内容的提问来源于stack exchange,提问作者Lasse V. Karlsen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:31:02