Roslyn 分析器:如何处理重命名类的副作用

问题描述 投票:0回答:1

我正在编写一个 Roslyn 分析器,它可以重命名与特定模式匹配的类。重命名“fix”成功地重命名了该类,但在我的单元测试中(它使用内存中的源,奇怪的是会产生名为“/0/Test0.cs”的虚拟文件),每当我指定“RenameFile:true”时SymbolRenameOptions 将类“SomeTypeName”重命名为“RenamedSomeTypeName”,我的测试失败并显示消息:

留言: 上下文:迭代代码修复应用程序 文件名预计为“/0/Test0.cs”,但实际为“RenamedSomeTypeName.cs” 预期字符串长度为 11,但实际长度为 22。字符串在索引 0 处不同。 预期:“/0/Test0.cs” 但是是:“RenamedSomeTypeName.cs”

我尝试向我的分析器添加一条新规则(尽管从逻辑上讲,这似乎是捕获问题的错误位置,因为该问题是修复的副作用,通常会在分析阶段完成后发生)。

我考虑过尝试向我的 CodeFixProvider 类注册一个新的代码修复,但这似乎也是徒劳的,因为不会有分析器事件来触发修复。

我徒劳地寻找有关如何处理此副作用失败消息的任何提示。是否有某种修复后分析器可以捕获此问题,以便我可以按预期将其标记。毕竟,这才是我真正想做的事情。

roslyn roslyn-code-analysis
1个回答
0
投票

我将此行为追溯到 NUnitVerifier.Equal(T预期, T实际, string? message = null) 方法。我通过在派生类中重写此方法,然后检查特定字符串对是否与单元测试的预期行为匹配来解决了该问题。如果是,则返回而不执行任何操作,否则调用基本方法。作为奖励,这个解决方案允许我失败负面案例。

注意,我还必须重写 PushContext,因为基类方法如下所示:

public virtual IVerifier PushContext(string context)
{
  Assert.AreEqual((object) typeof (NUnitVerifier), (object) this.GetType());
  return (IVerifier) new NUnitVerifier(this.Context.Push(context));
}

我只是在断言中将类型切换为 NUnitVerifier,然后返回自定义验证器类的实例。

© www.soinside.com 2019 - 2024. All rights reserved.