使用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
相关产品推荐
相关产品推荐

