断言失败时FluentAssertions抛出ArgumentOutOfRangeException(疑似NCrunch相关)
解决FluentAssertions 5.3.0 + NCrunch 3.14.0.1下的ArgumentOutOfRangeException问题
这个问题我之前碰到过类似的,结合你的环境来看,核心原因是FluentAssertions 5.3.0的调用者识别逻辑和NCrunch的代码插桩(instrumentation)不兼容——当测试失败时,FluentAssertions会尝试解析调用栈帧来提取断言里的变量名,生成更友好的错误消息,但NCrunch修改后的栈帧格式超出了旧版本FluentAssertions的处理范围,导致字符串截取时触发ArgumentOutOfRangeException。
给你几个可行的解决办法:
- 优先升级FluentAssertions版本:FluentAssertions在5.10.0及之后的5.x补丁版本,以及6.x+的正式版本里,都修复了和NCrunch兼容的这个问题。直接把你的FluentAssertions包升级到5.10.0以上(如果想保留5.x生态),或者直接升级到最新的6.x/7.x版本,这个错误应该会直接消失。
- 临时禁用调用者识别功能:如果暂时没法升级依赖包,可以在测试项目的初始化代码里(比如
[TestInitialize]标记的方法,或者测试类的静态构造函数)添加全局配置,关闭变量名提取逻辑:
FluentAssertions.AssertionOptions.DisableCallerIdentifier();
这样FluentAssertions就不会去解析栈帧生成带变量名的错误消息了,虽然错误消息的可读性会稍打折扣,但能彻底避免这个崩溃问题。
- 调整NCrunch的插桩设置:如果你的测试不需要NCrunch的代码插桩功能(比如代码覆盖率统计),可以在NCrunch的项目设置里找到Instrument assembly选项,把它关闭。这样NCrunch不会修改编译后的代码,FluentAssertions的栈帧解析就能正常工作了。
补充一下错误的触发细节:报错的
ExtractVariableNameFrom方法是FluentAssertions用来从栈帧里提取断言变量名的逻辑,NCrunch的插桩会给栈帧字符串添加额外的内容,导致FluentAssertions计算的startIndex超过了实际字符串长度,最终抛出了这个异常。
内容的提问来源于stack exchange,提问作者NeilMacMullen
相关产品推荐
相关产品推荐

