【问题标题】:Issue with Resharper's "Type argument is redundant" and assertionsResharper 的“类型参数是多余的”和断言的问题
【发布时间】:2012-03-17 00:07:54
【问题描述】:

我最近刚刚开始使用 ReSharper,并且正在寻找一种方法来解决我遇到的“类型参数规范是多余的”工具提示/快速修复的特定问题。在编写单元测试时,我一直在使用Assert.AreEqual<string>(x, y),ReSharper 将<string> 的使用标记为多余。我不希望在我的单元测试中将其标记为冗余或任何类似用法。有没有办法禁用这个特定的用例(可以扩展到其他断言)?请注意,由于源文件中会产生大量噪音,我想避免使用注释进行抑制。我也不想完全禁用该功能。

为了澄清,我认为这个特殊情况被错误标记的原因是因为泛型的使用导致断言中不匹配类型的错误在编译时而不是在测试运行时被标记。我想保持这种早期失败的行为,但基本上在我编写的每个测试中都消除由此引起的所有额外噪音。

谢谢

编辑:有一个关于测试内容是什么样子的问题,所以我提供了一个这样的断言示例,它导致 ReSharper 标记冗余。

[TestMethod]
public void ViewModelConstructor_NullProgram_SetsVisibilityToCollapsed()
{
    _currentProgram = null; //Set condition under test
    var Target = TargetMaker(); //Use shared constructor code in all tests
    Assert.AreEqual<System.Windows.Visibility>(System.Windows.Visibility.Collapsed, Target.SectionVisibility);
}

编辑 2:这是 ReSharper 建议更改前后的示例。这两段代码显示了非常不同的结果。我已经注意到测试函数名称中的不同行为。

class ClassUnderTest
{
    public string fieldUnderTest { get; set; }
    public ClassUnderTest()
    {
        fieldUnderTest = "New Value";
    }
}


[TestClass()]
public class ClassUnderTestTest
{

    [TestMethod()]
    public void ClassUnderTestConstructorTest_FailsTest()
    {
        ClassUnderTest target = new ClassUnderTest();
        Assert.AreEqual(true, target.fieldUnderTest);
    }

    [TestMethod()]
    public void ClassUnderTestConstructorTest_WontCompile()
    {
        ClassUnderTest target = new ClassUnderTest();
        Assert.AreEqual<string>(true, target.fieldUnderTest);
    }
}

【问题讨论】:

  • 为什么不为您的单元测试项目禁用它?
  • 主要原因是我找不到任何地方可以在每个项目的基础上设置它。我只能找到该功能的一般严重性设置。每个项目的设置在哪里?
  • 如果您说 R# 建议删除显式类型参数,并且这样做会导致行为发生变化,那么这是 R# 中的一个错误,应该这样提出。毕竟,如果它的存在导致不同的事情发生,它并不是“多余的”。但是,我不完全确定我可以可视化您的代码...
  • @AakashM 我大约一周前在 ReSharper 论坛上提出了这个问题,但没有得到该社区任何人的单一回复,所以虽然我希望看到这个问题得到解决,但我不确切地看到他们为了这样做而大吃一惊。是的,它确实会导致不同的行为。如果没有泛型,它将双方都视为对象并进行比较。由于强类型版本在编译时失败。
  • 而不是论坛(我应该说我从未使用过),如果你有一个简单的复制品,我会直接使用错误跟踪器 - 我自己在那里有 reported a number of issues,等等比目前还没有修复:) 你也可以在那里对问题进行投票,尽管我没有任何直接证据表明投票会影响查看事物的顺序...

标签: c# unit-testing resharper assert resharper-6.0


【解决方案1】:

您不必用 cmets 包围 Assert.AreEqual 的每个实例。相反,您可以使用 cmets 在整个源文件中突出显示此内容。只需在文件开头添加一条禁用注释并在末尾添加一条启用注释。噪音最小。

【讨论】:

    【解决方案2】:

    Resharper 6.1 引入了设置的概念——“层”。 Here's a blog-post 教你如何设置每个项目设置,这正是你想要的。

    【讨论】:

    • 这看起来像是 Daniel 开始了,它会很棒,但我似乎无法让它工作。我创建了一个像您的链接所述的图层。我在该层禁用了困扰我的测试项目的选项。我保存它并取消选中博客中提到的文件。该错误仍然被标记。我重新加载了 Visual Studio,错误仍然被标记。我通过工具提示禁用了该选项,并通过保存到对话框将其保存到我的新图层中,它仍在标记它。 DotSettings 文件也以项目命名。知道我哪里出错了吗?
    • GUI 实际上正在更新创建的 DotSettings 文件中的值的设置,但该设置并未应用于当前源文件。
    • 标记为已接受,因为这是我想要的可行解决方案,希望当 R# 为图层提供 GUI 支持时,这将起作用并解决我的问题。
    【解决方案3】:

    单击冗余部分,然后单击该行的左侧并选择Inspection option for Redundent...。在那里您可以选择较低的限制级别,直到您喜欢为止。

    【讨论】:

    • 据我所知,这将禁用所有内容,而不仅仅是我的特定用途。
    猜你喜欢
    • 2021-03-01
    • 1970-01-01
    • 2013-02-19
    • 2020-01-25
    • 1970-01-01
    • 2021-10-09
    • 2012-12-07
    • 2017-11-08
    • 1970-01-01
    相关资源
    最近更新 更多