7

我不想完全禁用警告,只是在 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。只是想知道是否有更好的方法。

4

6 回答 6

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(...);
于 2012-03-23T16:17:18.700 回答
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);
于 2016-04-09T12:30:39.037 回答
0

您可以使用 R# 外部注释来抑制警告(请参阅http://grahamrhay.wordpress.com/2011/01/09/external-annotations/)。

您使用的是哪个版本的 MbUnit/Gallio?

于 2012-03-28T11:11:42.393 回答
0

使用 NUnit 代替 MBUnit。NUnit 的 Assert.IsNotNull() 实现被认为是保证不为空,而 MBUnit 则不是。

于 2012-03-23T16:03:32.870 回答
0

如果我没记错的话,你的问题是当没有为每个对象检查 null 时,resharper 会发出警告。您可以修改 resharper 规则以不在测试类中给出空警告。 是有关更改测试方法的 ReSharper 命名样式的链接。

于 2012-03-23T15:39:18.450 回答
0

如果参数为空,您可以使用 ContractAnnotations 指示执行停止。请参阅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();
于 2018-02-03T20:49:11.713 回答