Любой способ игнорировать возможные исключения 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 для методов тестирования.