我正在使用Behaviors
和Behaves_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主题和字段的命名规则。我不知道如何控制未使用字段的此警告。我想避免在项目级别压制警告,因为它在常规情况下实际上很有用。
答案 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