当前位置: 首页 > 知识库问答 >
问题:

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

祝嘉懿
2023-03-14

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

private static string GenerateRequestUrl(Language language, WeatherDataType dataType) {
    var url = "https://data.weather.gov.hk/weatherAPI/opendata/weather.php?";

    url += language switch {
        Language.English => "lang=en",
        Language.TraditionalChinese => "lang=tc",
        Language.SimplifiedChinese => "lang=sc",
        _ => "lang=en"
    };

    url += dataType switch {
        WeatherDataType.LocalWeatherForecast => "&dataType=flw",
        WeatherDataType.NineDaysWeather => "&dataType=fnd"
    };

    return url;
}

我的测试方法涵盖了上面所有的情况,但是报告显示那些带有开关表达式的行没有被覆盖。就像这张图片:JetBrains Rider的报道亮点

我该怎么做才能把它们遮盖住。

共有1个答案

赖运珧
2023-03-14

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

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

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

密码

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
 类似资料:
  • 我正在尝试用C语言实现一个测试环境,它似乎比我预期的要困难得多。似乎我有3个选择: 1) 通过接口注入依赖关系。 2)通过模板注入依赖关系 这里可以找到这些选项的一个很好的讨论:C中依赖注入的接口与模板 3) 为每个需要模拟/存根的测试生成不同的可执行文件。 选项1和2需要对源代码进行大量修改,我并不十分喜欢这些修改。我不应该为了测试而牺牲性能/清晰度。另一方面,为每个测试制定不同的项目似乎也不是

  • 我一直试图获得本地单元测试的代码覆盖率,但没有成功。 这里有一个关于我所说的本地单元测试的参考。 https://developer.android.com/training/testing/unit-testing/local-unit-tests.html 但这似乎无济于事。我是不是漏掉了什么? 注意,如果我通过Android Studio运行本地单元测试,一切都很好。我点击了我的“测试”模块

  • 新的一年 之前因为上家公司的经营出了问题,年前的大裁员,过了一个漫长的春节。 之后加入了新公司,然后正好赶上一个很紧急的项目,忙成狗,因此好久没更新文章了。 不过,我又回来啦! 前言 自动化测试,我们将使用karma和nightmare,内容会包括: 单元测试 e2e测试(放下一篇文章) 其实,单元测试一般用在写公共包的时候,比如通用的js函数库,通用的UI组件库。基本不太会在做业务项目的时候还使

  • 我的问题是什么?我试图使用WinDBG附加到我的一些单元测试,这些测试在类库(单元测试项目)中,但是我不能让WinDbg打破托管异常。 我为什么要这样做?目前,我有一些使用垫片的测试,并且遇到了这个问题:UnitTestIsolation异常:在发布/调试模式下运行垫片测试时抛出异常 然而,只有当这些测试与其他一些不使用垫片的测试同时运行(在测试资源管理器中的播放列表相同)时,才会发生这种情况。单

  • 是否有人能够从Maven Build获得JaCoCo中JMockit和Powermock单元测试的复盖范围? 我有一个Powermock单元测试的现有测试集,我希望逐步将其迁移到JMockit。但是我需要能够在一个报告中看到所有单元测试的测试覆盖范围,最好是在Sonar中。 通过将JaCoCo置于“脱机”模式,我确实使JMockit和Powermock测试与Surefire/JaCoCo一起运行(

  • 我可以在声纳获得单位测试覆盖率通过使用Jacoco工具的代码覆盖率,并使用其报告在声纳属性文件为'sonar.jacoco.report路径=.../Reports/report.exec'。如何通过使用RAD的默认插件获得SONAR中的单元测试覆盖率,该插件以. coveragedata、. Analysis和. html格式生成报告?