2015-01-06 98 views
3

的Visual Studio 2013是顯示我的這個代碼覆蓋率(簡化本示例)對象爲失蹤塊:未覆蓋哪些區塊?

code coverage

據我知道,if應該有精確兩種狀態。通過並失敗。調試我的測試顯示,每個條件都會執行一次。特異性地與這兩個測試:

[TestMethod] 
public void CanNotHaveNegativeServiceWindow() 
{ 
    // arrange 
    var request = new CreateCaseRequest 
    { 
     ServiceWindowStart = new DateTime(2014, 12, 31, 12, 00, 00), 
     ServiceWindowEnd = new DateTime(2014, 12, 31, 11, 00, 00) 
    }; 

    // act 
    var result = request.GetValidationErrors(); 

    // assert 
    Assert.AreEqual(1, result.Count()); 
} 

[TestMethod] 
public void CanHaveServiceWindow() 
{ 
    // arrange 
    var request = new CreateCaseRequest 
    { 
     ServiceWindowStart = new DateTime(2014, 12, 31, 11, 00, 00), 
     ServiceWindowEnd = new DateTime(2014, 12, 31, 12, 00, 00) 
    }; 

    // act 
    var result = request.GetValidationErrors(); 

    // assert 
    Assert.AreEqual(0, result.Count()); 
} 

一個測試驗證的該特定if條件的肯定結果時,其他驗證陰性結果。什麼塊不覆蓋?我錯過了什麼邏輯條件?

+0

如果它們爲空或兩者相等,該怎麼辦? –

+0

@ DanielA.White:其他測試涵蓋了這些情況。如果兩個人都有價值,那麼只會達到「if」。如果他們都相同,那麼這就是'if'的錯誤情況,不是嗎?如同,與其他任何錯誤情況沒有什麼不同? – David

+0

我看到你正在嘗試做什麼(我刪除了我的舊評論)你可以嘗試'如果(ServiceWindowStart.Value> ServiceWindowEnd.Value)'而不是? – dasblinkenlight

回答

3

當你比較Nullable<T>值,C#編譯器產生額外的檢查,以查看該Nullable<T>■找值。這些檢查將始終以相同的方式出現在您的代碼中,因爲您已經完成了所有明確檢查的null

更改條件

if (ServiceWindowStart.Value > ServiceWindowEnd.Value) 

應該解決這個問題。

+0

Gaaaaaaaaaaaaaa!在此失去3個小時。我的代碼是在自定義比較器中。/* x和y是相同的類型*/if(x.MyNullableDate.HasValue && y.MyNullableDate.HasValue && x.MyNullableDate == y.MyNullableDate)我知道每個排列都通過UnitTests覆蓋。將.Value添加到...修正了覆蓋範圍。謝謝。 if(x.MyNullableDate.HasValue && y.MyNullableDate.HasValue && x.MyNullableDate.Value == y.MyNullableDate.Value) – granadaCoder

2

淺米色並不意味着代碼沒有被覆蓋。這意味着它只被部分覆蓋。您的ServiceWindowStartServiceWindowEnd可以爲空。但是你只用值來測試它們。你不測試平等。爲空值添加測試和在相同情況下添加測試應該覆蓋缺少的測試用例。

此結果的另一個可能的原因可能與以下事實有關:代碼覆蓋率是在IL代碼上執行的,而不是在C#代碼上執行的。 IL等價物可能沒有被完全覆蓋,或者代碼的結構可能不會被保留。

優化您的構建可能會解決問題。轉到解決方案資源管理器 - >屬性 - >生成選項卡 ​​- >選中「優化代碼」複選框。

使用此選項運行代碼分析。

這裏是有趣的博客貼子,討論了這個話題:http://blogs.msdn.com/b/ddietric/archive/2009/10/21/all-the-wonderful-colors-of-code-coverage.aspx

+0

其他測試(此處未顯示)涵蓋'null'值。此外,如果任何一個值爲'null',那麼if(ServiceWindowStart.HasValue && ServiceWindowEnd.HasValue)'阻止流量進入該塊。所討論的'if'條件僅適用於兩個值均不爲'null'的情況。我知道它是部分覆蓋的,我沒有看到的是沒有涉及的部分。 – David

+0

您是否也測試過平等情況。加上選項時,一個值爲空,其他不爲空? – PiotrWolkowski

+0

我剛剛爲相同的值添加了一個測試,結果相同。這並不讓我感到意外,因爲兩個相等的值會有一個「>」比較的結果與兩個不相等但小於值的結果相同。是的,我在其他測試中測試了「空值」。但是那些不相關,因爲如果任何一個值爲null,那麼緊接在所討論的那個之前的'if'條件將永遠不會被滿足。這是一個完全不同的邏輯分支。 – David