我不想完全禁用警告,就像它在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 :(得分: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(...);
答案 1 :(得分: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);
答案 2 :(得分:0)
如果我没有弄错的话,你的问题是resharper会在未检查到foreach对象时发出警告。您可以修改resharper规则,而不是在测试类中提供空警告。 Here是关于更改测试方法的ReSharper命名样式的链接。
答案 3 :(得分:0)
使用NUnit而不是MBUnit。 NUnit的Assert.IsNotNull()实现被选为保证不为null而MBUnit不是。
答案 4 :(得分:0)
您可以使用R#external annotations来抑制警告(请参阅http://grahamrhay.wordpress.com/2011/01/09/external-annotations/)。
您使用的是什么版本的MbUnit / Gallio?
答案 5 :(得分:0)
如果参数为null,则可以使用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();