Как подавить или исправить предупреждения Visual Studio о том, что поля MSpec Behaves_like не используются?

Я пишу идиоматические спецификации MSpec, используя поля Behaviors и Behaves_like

[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

Я уже знаком с аннотациями кода ReSharper для MSpec, и у меня есть правила именования тем и полей MSpec. Я не знаю, как контролировать это предупреждение для неиспользуемых полей. Я хотел бы избежать подавления предупреждения на уровне проекта, потому что это действительно полезно в обычных обстоятельствах.


person Anthony Mastrean    schedule 05.08.2011    source источник


Ответы (3)


если у предупреждений есть номер предупреждения, вы можете подавить эти предупреждения для каждого класса или даже строки кода, добавив отключить/включить прагму.

Чтобы подавить предупреждения для «Поле XYZ никогда не используется», вы делаете это:

#pragma warning disable 0169
... field declaration
#pragma warning restore 0169
person mtijn    schedule 05.08.2011
comment
Это предупреждение не имеет номера. - person Anthony Mastrean; 05.08.2011
comment
Вы уверены, что это предупреждение Visual Studio? Я никогда не видел их для полей MSpec. Однако ReSharper показывает всплывающую подсказку с предупреждением/кодом с текстом. - person Alexander Groß; 05.08.2011
comment
Я думал, что это может быть предупреждение StyleCop, но оно у меня не установлено :) - person Anthony Mastrean; 09.08.2011
comment
в любом случае, это похоже на дубликат сообщения из здесь. прочитайте это для полного ответа, похоже, у вас точно такое же предупреждение. - person mtijn; 09.08.2011
comment
Это не совсем дубликат, потому что, хотя проблема та же, наблюдение другое. Если вы ищете проблему из-за MSpec, это полезно. Если вы делаете структуры взаимодействия, вы найдете другой вопрос. Спасибо, что нашли ответ, но он хороший. - person Anthony Mastrean; 11.08.2011

Я знаю, что это почти двухлетний вопрос; но, глядя на исходный контекст вопроса, похоже, что @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() - но серьезно?). Но это способ «внедрить» каждое поле, если вы не хотите игнорировать их на уровне проекта.

person eduncan911    schedule 24.07.2013

Если вы используете ReSharper, обычно не нужно загромождать свой код #pragma warning disable 0169 шумом или, что еще хуже, глобально отключать это предупреждение для проекта. В конце концов, MSpec — это меньше шума и церемоний.

В ReSharper используется концепция аннотаций кода. И MSpec предоставляет некоторые из них для своих типов. Если у вас есть SubjectAttribute поверх ваших классов, ReSharper автоматически узнает, что он не должен жаловаться на неиспользуемые поля.

К сожалению, в ReSharper 6 есть ошибка, которая уже исправлена.

person bitbonk    schedule 28.09.2011
comment
У меня есть аннотации кода для MSpec v0.4.4.0, включенные в R# v5.1. В то время как ReSharper не жалуется на то, что поле не используется, Visual Studio (точнее, компилятор) по-прежнему жалуется. - person Anthony Mastrean; 29.09.2011
comment
Хотя аннотации имеют дело с большинством этих предупреждений, они не работают с теми, где идиома объявляет поле, но не использует его. Так что для Behaves_like<T> аннотации не помогают. (В основном потому, что, как указывает Энтони Мастрейн, предупреждения, которые вы видите для этих полей, исходят от компилятора, а не от R#.) Если вы пометите поле как protected, это избавит вас от предупреждения, но это немного ужасный взлом. - person Ian Griffiths; 19.08.2013