如何使用Moq结合It.IsAny<>处理out参数并验证方法调用次数?
解决Moq中out参数验证的编译器错误
这个问题我之前也碰到过,核心原因是C#对out参数的语法限制:它要求必须传递一个可赋值的存储位置(比如变量、字段),而你用的It.IsAny<StringBuilder>()是一个返回值的方法调用,不符合这个要求,所以编译器直接报错了。
这里有两种简单的解决方式,都能实现你“不关心out参数具体值,只验证方法被调用一次”的需求:
方法1:使用Moq专门的ref/out匹配器(推荐)
Moq提供了It.Ref<T>.IsAny这个静态成员,就是专门用来处理ref/out参数匹配的,它本质是一个符合语法要求的可赋值占位符,直接用就行:
mock.Verify(x => x.Method("String", out It.Ref<StringBuilder>.IsAny), Times.Once);
这种方式最清晰,直接传达了“我不关心这个out参数的具体值”的意图,代码也更简洁。
方法2:声明一个临时变量作为out参数
如果你不想用It.Ref,也可以随便声明一个StringBuilder类型的临时变量,把它作为out参数传递给验证方法。Moq在验证时,只要参数类型匹配、第一个参数是"String",就会通过验证(它不会在意这个临时变量的具体值):
// 变量值随便设,null或者new一个都可以 StringBuilder dummyOut = null; mock.Verify(x => x.Method("String", out dummyOut), Times.Once);
这两种方法都能解决你的编译器错误,并且达到验证方法调用次数的目的。
内容的提问来源于stack exchange,提问作者fota666
相关产品推荐
相关产品推荐

