2012-03-23 41 views
6

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

+0

相關:http://stackoverflow.com/questions/4393456/resharper-how-to-remove-possible-system-nullreferenceexception-warning – JYelton 2012-03-23 15:30:43

+0

你能發佈一個更完整的例子?我無法重現這一點;當使用NUnit的斷言庫時,Assert.IsNotNull的添加將刪除警告 - 並且它是否在測試中不起作用。 – 2012-03-23 15:47:02

+0

@JamesWorld,我正在使用MBUnit,不知道這是否有所作爲。我發佈的代碼確實使用MBUnit 2.4.2和ReSharper 6.1提供了警告。我知道如果它在測試中並不重要,但我只關心在測試類中禁用它。其他地方應該啓用它。 – Brandon 2012-03-23 15:52:56

回答

0

如果我沒有弄錯,你的問題是當沒有檢查到null對象時,resharper會發出警告。您可以修改resharper規則,不要在測試類中給出空警告。 Here是關於爲測試方法更改ReSharper命名風格的鏈接。

+0

當你開始爲每個單詞寫作時,你都知道你編程太多。 :)你可以提供如何做到這一點的步驟?我如何告訴Resharper考慮什麼考試班? – Brandon 2012-03-23 15:41:15

+0

@Brandon你讓我微笑:)請看看; http://atombrenner.blogspot.com/2010/07/how-to-change-resharper-naming-style.html – daryal 2012-03-23 15:46:22

+0

-1我認爲你錯了。警告的外觀並不特定於測試類。 – 2012-03-23 15:47:49

0

使用NUnit而不是MBUnit。 NUnit的Assert.IsNotNull()被實現爲保證不爲null,而MBUnit則不是。

+0

當然這在你的情況下可能不太實際。 – 2012-03-23 16:16:42

+1

如何保證Assert.That(結果,Is.Not.Null)? – labilbe 2015-11-25 13:52:52

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(...); 
+0

感謝您的回答,但問題仍然存在。即使我斷言該對象並且該屬性不爲null,警告也不會在意,並且無論如何都要發出警告。如果我執行'object == null'並返回該方法,警告將消失。 – Brandon 2012-03-23 16:22:11

+0

@Brandon出於好奇,儘管存在警告,測試過程是否會按照您的預期通過和失敗? – Alex 2012-03-23 16:30:30

+0

是的。這更像是一個棘手的問題。我只是不喜歡解決方案廣泛的檢查充滿了一堆警告,而這些警告實際上不應該是警告。這不影響實際的代碼或測試或任何事情。 – Brandon 2012-03-23 16:33:13

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

您可以使用ContractAnnotations指示停止執行,如果參數爲null。見jetbrains contract annotations。 Sample類:

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