2012-03-23 3 views
6

Я не хочу полностью отключать предупреждения, только когда это указано в утверждении.Любой способ игнорировать возможные ошибки Null Reference Exception при использовании утверждений Assert?

Так, например, если у меня есть следующие две строки

var someObject = GetObject(); 
Assert.IsNotNull(someObject, "someObject should not be null"); 
Assert.AreEqual(expectedValue, someObject.SomeProperty); 

я получу возможность ссылки нулевой предупреждение на второй линии на someObject.SomeProperty. Можно ли отключить предупреждение, когда он находится в пределах определенного вызова, например Assert.AreEqual?

Поскольку это проблема с большим количеством модульных тестов, я не хочу замалчивать тесты с помощью кода отключения ReSharper.

Сейчас единственный вариант я могу думать о том, чтобы изменить каждый Assert.IsNotNull вызов быть

var someObject = GetObject(); 
if(someObject == null) 
{ 
    Assert.Fail("someObject is null"); 
    return; 
} 

Хотя этот вид, кажется, поражение цели с Assert.IsNotNull в первую очередь. Просто интересно, есть ли лучший способ.

+0

Связанный: http://stackoverflow.com/questions/4393456/resharper-how-to-remove-possible-system-nullreferenceexception-warning – JYelton

+0

Можете ли вы опубликовать более полный пример? Я не могу воспроизвести это; при использовании библиотеки утверждений NUnit добавление Assert.IsNotNull удаляет предупреждение - и находится ли оно в тесте или нет, не имеет никакого эффекта. –

+0

@JamesWorld, я использую MBUnit, не уверен, что это имеет значение. Код, который я опубликовал, дает предупреждение с использованием MBUnit 2.4.2 и ReSharper 6.1.Я знаю, что это не имеет значения, если он прошел тест или нет, но я беспокоюсь только об отключении его в тестовых классах. Везде он должен быть включен. – Brandon

ответ

0

Если я не ошибаюсь, ваша проблема в том, что resharper дает предупреждения, когда null не проверен для объекта foreach. Вы можете изменять правила resharper, чтобы не давать нулевые предупреждения в тестовых классах. Here - ссылка об изменении стиля именования ReSharper для методов тестирования.

+0

Вы знаете, что слишком много программ, когда начинаете писать для каждого, как одно слово. :) Не могли бы вы дать инструкции о том, как это сделать? Как сообщить Resharper, что считать тестовым классом? – Brandon

+0

@Brandon, ты заставил меня улыбнуться :) пожалуйста, посмотри; http://atombrenner.blogspot.com/2010/07/how-to-change-resharper-naming-style.html – daryal

+0

-1 Я думаю, вы ошибаетесь. Внешний вид предупреждения не является специфичным для тестовых классов. –

0

Используйте NUnit вместо MBUnit. Выполнение NUnit Assert.IsNotNull() воспринимается как гарантия не null, тогда как MBUnit - нет.

+0

Конечно, это, вероятно, не очень практично в вашем случае. –

+1

Как гарантировать для Assert.That (результат, Is.Not.Null)? – labilbe

1

Я не знаю конкретной библиотеки вы используете, но я хотел бы попробовать что-то вроде

Assert.IsTrue(someObject != null); 

или, для полноты картины,

Assert.IsNotNull(someObject, "someObject must not be null"); 
Assert.IsNotNull(someObject.SomeProperty, "SomeProperty must not be null either"); 
Assert.SomethingElse(...); 
+0

Спасибо за ответ, но проблема все равно будет существовать. Даже если я утверждаю объект, и свойство не равно null, предупреждения не заботятся и дают предупреждение в любом случае. Предупреждения исчезнут, если я сделаю «object == null» и вернусь из метода. – Brandon

+0

@Brandon Из любопытства, несмотря на предупреждения, проходят ли тесты и терпят неудачу, как и следовало ожидать? – Alex

+0

есть. Это больше проблема. Мне просто не нравится, что в широких проверках решения заполняется куча предупреждений, которые на самом деле не должны быть предупреждениями. Это не влияет на фактический код или тестирование или что-то еще. – Brandon

1

Добавьте это к вашему проекту:

public static class AssertionsExtensions 
{ 
    [NotNull] 
    public static TSubject ShouldNotBeNull<TSubject>([CanBeNull] this TSubject source, 
     [CanBeNull] string because = "", [CanBeNull] [ItemCanBeNull] params object[] reasonArgs) 
    { 
     source.Should().NotBeNull(because, reasonArgs); 

     // ReSharper disable once AssignNullToNotNullAttribute 
     return source; 
    } 
} 

Затем использовать его, как это, например:

  // Assert 
      succeeded.Should().Be(true, "<USB loopback cable must be connected and COM port must be correct.>"); 
      DeviceStatus deviceStatusNotNull = testRunner.Result.ShouldNotBeNull(); 
      deviceStatusNotNull.DeviceAddress.Should().Be(deviceAddress); 
      deviceStatusNotNull.IsInNetwork.Should().Be(true); 
0

Вы можете использовать ContractAnnotations, чтобы указать выполнение останавливается, если параметр является недействительным. См. jetbrains contract annotations. Пример класса:

public static class FluentExtensions 
{ 
     //see: https://www.jetbrains.com/help/resharper/2017.3/Contract_Annotations.html 
     [ContractAnnotation("null => stop")] 
     public static void ShouldNotBeNull(this object objToTest) 
     { 
      objToTest.Should().NotBeNull(); 
     } 

} 

Использование:

doc.ShouldNotBeNull(); 
doc.Content.ShouldNotBeNull();