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

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

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

Assert.IsTrue(someObject != null);

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

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

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

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);

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

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

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

Вы можете использовать ContractAnnotations, чтобы указать, что выполнение останавливается, если параметр имеет значение null. Посмотрите аннотации контракта реактивного мозга. Образец класса:

 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();

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

Другие вопросы по тегам