Любой способ игнорировать возможные исключения Null Reference Exception при использовании операторов Assert? - PullRequest
7 голосов
/ 23 марта 2012

Я не хочу полностью отключать предупреждения, только когда это в операторе 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 во-первых. Просто интересно, есть ли лучший способ.

Ответы [ 6 ]

1 голос
/ 09 апреля 2016

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

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);
1 голос
/ 23 марта 2012

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

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 голосов
/ 03 февраля 2018

Вы можете использовать ContractAnnotations, чтобы указать, что выполнение останавливается, если параметр имеет значение null.См. примечания к контракту Jetbrains .Класс выборки:

 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();
0 голосов
/ 28 марта 2012

Вы можете использовать внешние аннотации R # для подавления предупреждений (см. http://grahamrhay.wordpress.com/2011/01/09/external-annotations/).

Какую версию MbUnit / Gallio вы используете?

0 голосов
/ 23 марта 2012

Используйте NUnit вместо MBUnit.Реализация Assert.IsNotNull () в NUnit воспринимается как гарантирующая ненулевое значение, а в MBUnit - нет.

0 голосов
/ 23 марта 2012

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

...