使用Assert语句时,有什么方法可以忽略可能的空引用异常警告吗?

时间:2012-03-23 15:22:28

标签: c# unit-testing mbunit resharper-6.1

我不想完全禁用警告,就像它在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 个答案:

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