如何禁止或修复MSpec Behaves_like字段未使用的Visual Studio警告?

时间:2011-08-05 15:18:14

标签: visual-studio mspec

我正在使用BehaviorsBehaves_like字段编写惯用的MSpec规范

[Subject(typeof(IUnitMaskConverter))]
public class When_converting_unit_masks_by_lookup
{
    Behaves_like<UnitMaskConverterBehaviors> a_unit_mask_converter;
    protected static LookupUnitMaskConverter _converter = new LookupUnitMaskConverter();
}

Visual Studio显示构建警告

The field 'Specs.UnitMask.When_converting_unit_masks_by_lookup.a_unit_mask_converter' is never used

我已经熟悉MSpec的ReSharper代码注释,并且我有MSpec主题和字段的命名规则。我不知道如何控制未使用字段的此警告。我想避免在项目级别压制警告,因为它在常规情况下实际上很有用。

3 个答案:

答案 0 :(得分:5)

我知道这是近两年的问题;但是,看看原始问题的背景,看起来@Anthony实际上想在他的测试项目中使用MSpec。

@bitbonk和@mtijn的两个答案充分说明了为什么你应该 从不 在项目层面忽略这些答案。但是,这两个答案忽略了@ Anthony的原意,即他正试图使用​​MSpec。

你知道,MSpec是一个BDD框架,它使用繁重的委托和字段定义来定义你的规范。通常,您有未分配的字段和委托。这些导致警告在VS中疯狂地飞行,特别是如果你有StyleCop和其他自动化工具来控制开发人员。

[Subject(typeof(PostService), "when_calling_Save()"]
class with_a_valid_Post_object
{
  It should_save_to_repository;

  It should_update_post_counter;

  Behaves_like<Normal_Behaviors> a_PostService;
}

想猜一下刚刚造成多少警告?事实上,提前规范我们的代码和项目是完全正常的。当BDD指出你的设计时,你不应该被一堆警告惹恼:MSpec的全部意义是在语法噪音最少的情况下指定你的整体故事。警告,在你制作十几个故事后,每个故事都会非常嘈杂!

现在,我可以看到人们试图证明这些警告是合理的,他说:“嘿,还没有测试,它只是存根!警告使我们需要实现它们。”实际上,MSpec在运行时已经在输出窗口中以不同的方式呈现这些“存根”规范,在测试总数中标记为“已跳过”,并且在HTML输出报告中也非常可爱。换句话说,你不需要警告你就没有实现规格,因为跑步者已经这样做了。

Behaves_like<T>已经有点奇怪了。但请注意,就是这样,Behaves_like<T> behaviors没有更多的实现。它只是一个未指定的字段,MSpec的跑步者使用(所有场代表)并运行它们。

所以解决方案很简单:对于专门针对Machine.Specifications项目的MSpec“Specs”测试项目,我经常右键单击项目的设置并将它们添加到Supress框中:

0169; 0649

同样,这仅适用于MSpec测试项目(或实际上任何其他BDD C#框架,因为它们使用繁重的委托和未分配的字段)。你永远不应该为任何正常的项目做这件事。

或者,如果您的团队负责人否认您为测试项目编辑它的权利,您可以继续执行您的规范,通过使用MSpec添加您首先想要避免的连接噪音(责怪你的团队领导通过“上下文切换”让你的生活变得更加困难!)。

[Subject(typeof(PostService), "when_calling_Save()"]
class with_a_valid_Post_object
{
  It should_save_to_repository =()=> { };

  It should_update_post_counter =()=> { };

  Behaves_like<Normal_Behaviors> a_PostService =()=> { };
}

这更难看,并且真正让你脱离了你想要指出的整体BDD故事的焦点。更不用说,你的所有规范都会在没有任何实现的情况下通过(你可以添加更多的东西以使其成为一个难以实现的失败,但{严重?}。)。但是,如果您不想在项目级别忽略它们,这是一种“实现”每个字段的方法。

答案 1 :(得分:2)

如果您使用ReSharper,通常情况下,没有必要使用#pragma warning disable 0169噪声来扰乱您的代码,甚至更糟糕的是,全局禁用该项目的此警告。无论如何,MSpec都是关于减少噪音和仪式的。

ReSharper有code annotations这个概念。 MSpec为其类型提供了一些。如果你的课程有SubjectAttribute,ReSharper会自动知道它不能抱怨未使用的字段。

不幸的是,bug about this in ReSharper 6已经修复了。

答案 2 :(得分:1)

如果警告有警告编号,您可以通过添加pragma disable/enable来抑制每个班级甚至代码行的警告。

要禁止“永远不使用字段XYZ”的警告,请执行this

#pragma warning disable 0169
... field declaration
#pragma warning restore 0169