未涵盖C#8.0单元测试开关表达式

未涵盖C#8.0单元测试开关表达式,c#,unit-testing,code-coverage,C#,Unit Testing,Code Coverage,我正在使用C#8.0,它支持我的项目中的开关表达式。我最近正在构建一个单元测试项目,并生成代码覆盖率报告。但是所有的开关表达式似乎都有问题。我的代码中有一些类似于以下内容的行: private静态字符串生成器查询(语言,WeatherDataType数据类型){ 变量url=”https://data.weather.gov.hk/weatherAPI/opendata/weather.php?"; url+=语言开关{ Language.English=>“lang=en”, Language

我正在使用C#8.0,它支持我的项目中的开关表达式。我最近正在构建一个单元测试项目,并生成代码覆盖率报告。但是所有的开关表达式似乎都有问题。我的代码中有一些类似于以下内容的行:

private静态字符串生成器查询(语言,WeatherDataType数据类型){
变量url=”https://data.weather.gov.hk/weatherAPI/opendata/weather.php?";
url+=语言开关{
Language.English=>“lang=en”,
Language.TraditionalChinese=>“lang=tc”,
Language.SimplifiedChinese=>“lang=sc”,
_=>“lang=en”
};
url+=数据类型开关{
WeatherDataType.LocalWeatherForecast=>“&dataType=flw”,
WeatherDataType.NineDaysWeather=>“&dataType=fnd”
};
返回url;
}
我的测试方法涵盖了上述所有情况,但报告显示,不包括带有开关表达式的行。如图所示:


我应该怎么做才能覆盖它们。

虽然这可能不是您希望的答案,但代码覆盖似乎不适用于非顺序开关表达式

查看IL代码时,新的C#8.0开关表达式首先计算(跳转)哪个表达式为真,然后设置url。
而sequential switch语句在case语句之后设置url

因此,如果您想要全面覆盖,您应该使用sequential switch语句(如下面代码中的WeatherDataType)

代码

    .method public hidebysig static string  GenerateRequestUrl(valuetype Demo.Generator/Language language,
                                                           valuetype Demo.Generator/WeatherDataType dataType) cil managed
{
  // Code size       130 (0x82)
  .maxstack  2
  .locals init (string V_0,
           string V_1,
           string V_2,
           valuetype Demo.Generator/WeatherDataType V_3,
           valuetype Demo.Generator/WeatherDataType V_4,
           string V_5)
  IL_0000:  nop
  IL_0001:  ldstr      "https://data.weather.gov.hk/weatherAPI/opendata/we"
  + "ather.php\?"
  IL_0006:  stloc.0
  IL_0007:  ldloc.0
  IL_0008:  stloc.1
  IL_0009:  ldc.i4.1
  IL_000a:  brtrue.s   IL_000d
  IL_000c:  nop
  IL_000d:  ldarg.0
  IL_000e:  switch     ( 
                        IL_0021,
                        IL_0029,
                        IL_0031)
  IL_001f:  br.s       IL_0039
  IL_0021:  ldstr      "lang=en"
  IL_0026:  stloc.2
  IL_0027:  br.s       IL_0041
  IL_0029:  ldstr      "lang=tc"
  IL_002e:  stloc.2
  IL_002f:  br.s       IL_0041
  IL_0031:  ldstr      "lang=sc"
  IL_0036:  stloc.2
  IL_0037:  br.s       IL_0041
  IL_0039:  ldstr      "lang=en"
  IL_003e:  stloc.2
  IL_003f:  br.s       IL_0041
  IL_0041:  ldc.i4.1
  IL_0042:  brtrue.s   IL_0045
  IL_0044:  nop
  IL_0045:  ldloc.1
  IL_0046:  ldloc.2
  IL_0047:  call       string [System.Runtime]System.String::Concat(string,
                                                                    string)
  IL_004c:  stloc.0
  IL_004d:  ldarg.1
  IL_004e:  stloc.s    V_4
  IL_0050:  ldloc.s    V_4
  IL_0052:  stloc.3
  IL_0053:  ldloc.3
  IL_0054:  brfalse.s  IL_005e
  IL_0056:  br.s       IL_0058
  IL_0058:  ldloc.3
  IL_0059:  ldc.i4.1
  IL_005a:  beq.s      IL_006c
  IL_005c:  br.s       IL_007a
  IL_005e:  ldloc.0
  IL_005f:  ldstr      "&dataType=flw"
  IL_0064:  call       string [System.Runtime]System.String::Concat(string,
                                                                    string)
  IL_0069:  stloc.0
  IL_006a:  br.s       IL_007a
  IL_006c:  ldloc.0
  IL_006d:  ldstr      "&dataType=fnd"
  IL_0072:  call       string [System.Runtime]System.String::Concat(string,
                                                                    string)
  IL_0077:  stloc.0
  IL_0078:  br.s       IL_007a
  IL_007a:  ldloc.0
  IL_007b:  stloc.s    V_5
  IL_007d:  br.s       IL_007f
  IL_007f:  ldloc.s    V_5
  IL_0081:  ret
} // end of method Generator::GenerateRequestUrl

IL代码

    .method public hidebysig static string  GenerateRequestUrl(valuetype Demo.Generator/Language language,
                                                           valuetype Demo.Generator/WeatherDataType dataType) cil managed
{
  // Code size       130 (0x82)
  .maxstack  2
  .locals init (string V_0,
           string V_1,
           string V_2,
           valuetype Demo.Generator/WeatherDataType V_3,
           valuetype Demo.Generator/WeatherDataType V_4,
           string V_5)
  IL_0000:  nop
  IL_0001:  ldstr      "https://data.weather.gov.hk/weatherAPI/opendata/we"
  + "ather.php\?"
  IL_0006:  stloc.0
  IL_0007:  ldloc.0
  IL_0008:  stloc.1
  IL_0009:  ldc.i4.1
  IL_000a:  brtrue.s   IL_000d
  IL_000c:  nop
  IL_000d:  ldarg.0
  IL_000e:  switch     ( 
                        IL_0021,
                        IL_0029,
                        IL_0031)
  IL_001f:  br.s       IL_0039
  IL_0021:  ldstr      "lang=en"
  IL_0026:  stloc.2
  IL_0027:  br.s       IL_0041
  IL_0029:  ldstr      "lang=tc"
  IL_002e:  stloc.2
  IL_002f:  br.s       IL_0041
  IL_0031:  ldstr      "lang=sc"
  IL_0036:  stloc.2
  IL_0037:  br.s       IL_0041
  IL_0039:  ldstr      "lang=en"
  IL_003e:  stloc.2
  IL_003f:  br.s       IL_0041
  IL_0041:  ldc.i4.1
  IL_0042:  brtrue.s   IL_0045
  IL_0044:  nop
  IL_0045:  ldloc.1
  IL_0046:  ldloc.2
  IL_0047:  call       string [System.Runtime]System.String::Concat(string,
                                                                    string)
  IL_004c:  stloc.0
  IL_004d:  ldarg.1
  IL_004e:  stloc.s    V_4
  IL_0050:  ldloc.s    V_4
  IL_0052:  stloc.3
  IL_0053:  ldloc.3
  IL_0054:  brfalse.s  IL_005e
  IL_0056:  br.s       IL_0058
  IL_0058:  ldloc.3
  IL_0059:  ldc.i4.1
  IL_005a:  beq.s      IL_006c
  IL_005c:  br.s       IL_007a
  IL_005e:  ldloc.0
  IL_005f:  ldstr      "&dataType=flw"
  IL_0064:  call       string [System.Runtime]System.String::Concat(string,
                                                                    string)
  IL_0069:  stloc.0
  IL_006a:  br.s       IL_007a
  IL_006c:  ldloc.0
  IL_006d:  ldstr      "&dataType=fnd"
  IL_0072:  call       string [System.Runtime]System.String::Concat(string,
                                                                    string)
  IL_0077:  stloc.0
  IL_0078:  br.s       IL_007a
  IL_007a:  ldloc.0
  IL_007b:  stloc.s    V_5
  IL_007d:  br.s       IL_007f
  IL_007f:  ldloc.s    V_5
  IL_0081:  ret
} // end of method Generator::GenerateRequestUrl

升级您的测试框架和工具。我猜它不支持这些功能。您使用的是什么版本的Rider?我使用的是最新版本的Rider 2020.2.1如果您使用的是老式开关,测试是否通过?如果是,这是一个.NET Framework项目吗?如果是,您是否安装了所需的Nuget软件包?请提供一个最低限度的工作解决方案或到您的项目的github链接。这似乎是唯一的解决方案。非常感谢。