6

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

4

3 回答 3

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 的运行程序使用(所有字段代表)并运行它们的未分配字段。

所以解决方案很简单:对于 MSpec "Specs" 测试项目,专门用于 Machine.Specifications 项目,我经常右键单击项目的设置并将这些添加到抑制框:

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 故事的焦点。更不用说,您的所有规范现在都将通过而没有任何实现(您可以添加更多以使其成为硬失败,throw new NotImplementedException()但认真吗?)。但是,如果您不想在项目级别忽略它们,这是一种“实施”每个字段的方法。

于 2013-07-24T20:40:53.620 回答
2

如果您使用 ReSharper,通常没有必要让您的代码杂乱无章,#pragma warning disable 0169甚至更糟的是,为项目全局禁用此警告。毕竟,MSpec 就是为了减少噪音和仪式。

ReSharper 有这个代码注释的概念。MSpec 为其类型提供了一些。如果您的类中有SubjectAttribute,ReSharper 将自动知道它不能抱怨未使用的字段。

不幸的是,ReSharper 6中有一个关于此的错误,该错误已被修复。

于 2011-09-28T18:59:50.870 回答
1

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

要禁止“从未使用字段 XYZ”的警告,请执行以下操作:

#pragma warning disable 0169
... field declaration
#pragma warning restore 0169
于 2011-08-05T15:27:04.623 回答