簡體   English   中英

代碼覆蓋率中不考慮委托開關

[英]Delegating Switch not considered in Code Coverage

在處理開關盒時,我發現了以下問題。 R# 向我展示了 switch 語句的簡化,當您分配變量時,它基本上將委托綁定到 case 標簽。

var shape = shapeType switch
{
    ShapeType.Ellipse => new Ellipse(),
    ShapeType.Polygon => new Polygon(),
    _ => new Rectangle()
};

這樣做的好處是對於巨大的開關案例具有可讀性,因為您基本上節省了三分之二的行,用於分配開關。

我的問題:我真的很喜歡這種類型的開關,因為它提高了可讀性,但是在 Visual Studio (VS Enterprise 2019 - 16.4.4) 的代碼覆蓋率工具中沒有考慮到這一點。 由於我們的政策致力於實現約 90% 的代碼覆蓋率,因此每個百分比都是有價值的。

是否有可能在代碼覆蓋范圍內包含這些開關?

凱特在這里有一個觀點。 我的項目有一個硬性 100% 的代碼覆蓋閾值,並且 switch 表達式永遠不會被完全覆蓋,即使等效的 switch 語句是。

下面是一個例子:

以下 switch 語句在我的項目中提供了 100% 的代碼覆蓋率:

switch (values[3])
{
    case "F": return new string(Convert.ToString(value, 2).Reverse().ToArray()).PadRight(max, '0');
    case "G": return $"{value} of {max}";
    case "R" when value == 0: return $"none of {max}";
    case "R" when value == 1: return $"1st of {max}";
    case "R" when value == 2: return $"2nd of {max}";
    case "R" when value == 3: return $"3rd of {max}";
    default: return $"{value}th of {max}";
}

等效的 switch 表達式僅給出 99.91%,並且在 Jenkins 上構建失敗:

return values[3] switch
{
    "F" => new string(Convert.ToString(value, 2).Reverse().ToArray()).PadRight(max, '0'),
    "G" => $"{value} of {max}",
    "R" when value == 0 => $"none of {max}",
    "R" when value == 1 => $"1st of {max}",
    "R" when value == 2 => $"2nd of {max}",
    "R" when value == 3 => $"3rd of {max}",
    _ => $"{value}th of {max}"
};

並且代碼覆蓋着色並不表示哪個分支沒有被覆蓋,因為它標記了整個語句。

我認為這是編譯器如何生成表達式的最終 IL 的問題。 它應該作為 C# 錯誤處理並提交給 Microsoft 進行修復。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM