专栏首页雪雁的专栏Magicodes.IE编写多框架版本支持和执行单元测试

Magicodes.IE编写多框架版本支持和执行单元测试

背景

很多情况下,我们编写了一些工具库之后,往往在某些框架版本中会出现一些问题,比如本人最近写的一个导入导出的工具库Magicodes.IE就出现了以下问题:

(GitHub:https://github.com/xin-lai/Magicodes.IE)

虽然支持标准库2.0,但是通过编写单元测试,确实发现如此:

因此,单元测试确实需要针对各个框架版本进行测试,并且相关代码需要针对框架进行兼容修改。那么如何实现呢?接下来我们一步步实践。

.NET框架版本说明

最新目标框架版本

下表定义了最常见的目标框架、如何引用这些框架,以及它们实现的 .NET Standard 版本。 这些目标框架版本是最新的稳定版本。 预览版不会显示。 目标框架名字对象 (TFM) 是一个标准化令牌格式,用于指定 .NET 应用或库的目标框架。

目标 Framework

最新 稳定版本

目标框架名字对象 (TFM)

已实现 .NET Standard 版本

.NET Standard

2.1

netstandard2.1

不可用

.NET Core

3.0

netcoreapp3.0

2.1

.NET Framework

4.8

net48

2.0

支持的目标框架版本

目标框架通常由 TFM 引用。 下表显示 .NET Core SDK 和 NuGet 客户端支持的目标框架。 等效项显示在括号内。 例如,win81 对于 netcore451 来说等效于 TFM。

如何让工程支持多个框架?

以单元测试工程为例:

<PropertyGroup>
    <TargetFrameworks>netcoreapp3.0;netcoreapp2.2;netcoreapp3.1;net461</TargetFrameworks>
    <IsPackable>false</IsPackable>
  </PropertyGroup>
如上述代码所示,我们可以通过“TargetFrameworks”元素来定义多个框架。那么如何在工程里面添加条件判断以进行编译呢?
<ItemGroup Condition=" '$(TargetFramework)' == 'net461' ">
    <PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
  </ItemGroup>
除了工程里面,我们代码中如何针对不同的框架版本编写代码呢?
#if NET461
            return excelPackage.Workbook.Worksheets[typeof(T).GetDisplayName()] ??
                   excelPackage.Workbook.Worksheets[ExcelImporterSettings.SheetName] ??
                   excelPackage.Workbook.Worksheets[1];
#else
            return excelPackage.Workbook.Worksheets[typeof(T).GetDisplayName()] ??
                   excelPackage.Workbook.Worksheets[ExcelImporterSettings.SheetName] ??
                   excelPackage.Workbook.Worksheets[0];
#endif

这些“NET461”的符号都有哪些呢?如下所示:

完整的 .NET Core 目标框架的预处理器符号列表

NETFRAMEWORK
, 
NET20
, 
NET35
, 
NET40
, 
NET45
, 
NET451
, 
NET452
, 
NET46
, 
NET461
, 
NET462
, 
NET47
, 
NET471
, 
NET472
, 
NET48

Magicodes.IE之多框架版本测试

了解了这些知识,我们就可以编写多框架版本的实现和单元测试了。

单元测试添加多框架支持

  1. 修改TargetFramework为TargetFrameworks
  1. 设置分组 根据目标框架分组:
  1. 修复编译错误
  2. 执行单元测试 单元测试结果如下图所示:

针对具体的单元测试,我们还可以指定目标框架进行运行和调试:

总结和经验分享

结合整改的过程,我们可以得出以下经验:

  • 单元测试编写时的异常消息判断尽量使用字符串包含判断,而不判断完整格式。

如上面所示,左侧代码在net461、netcoreapp2.2都是无法通过的,格式化的参数模板不一致。

  • 特定框架、平台代码需添加符号判断

如下面示例,默认情况下,.NET Core 不提供除代码页 28591 以外的其他任何代码页编码和 Unicode 编码,例如 UTF-8 和 UTF-16,所以我们可以使用以下代码进行添加,但是需要排除.NET Framework:

除了特定代码之外,有时还有特定依赖的包:

  • 在某些情况下不要使用过新的语法

比如以下代码:

转载是一种动力 分享是一种美德

如果喜欢作者的文章,请关注【麦扣聊技术】订阅号以便第一时间获得最新内容。本文版权归作者和湖南心莱信息科技有限公司共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

本文分享自微信公众号 - magiccodes(xl----0),作者:magiccodes

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-12-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 《.NET Core 和前后端那些事儿》技术交流活动纪实

    2019年3月10日,下午,在位于沁园春御院的长沙市互联网活动基地,在长沙市.NET技术社区的组织下,长沙市.NET技术圈第一次纯粹的技术沙龙在这里召开。这次活...

    心莱科技雪雁
  • .NET Core 3.0 中的新变化

    .NET Core 3.0 是 .NET Core 平台的下一主要版本。本文回顾了 .Net Core 发展历史,并展示了它是如何从基本支持 Web 和数据工作...

    心莱科技雪雁
  • IHostingEnvironment VS IHostEnvironment - .NET Core 3.0中的废弃类型

    在本篇博客中,我将描述与之前版本相比,ASP.NET Core 3.0 中已经被标记为废弃的类型。我将解释一下为什么这些类型被废弃了,它们的替换类型是什么,以及...

    心莱科技雪雁
  • Magicodes.IE编写多框架版本支持和执行单元测试

    很多情况下,我们编写了一些工具库之后,往往在某些框架版本中会出现一些问题,比如本人最近写的一个导入导出的工具库Magicodes.IE(GitHub:https...

    雪雁-心莱科技
  • 3小时搞定一个简单的MIS系统案例Northwind,有视频、有源代码下载、有真相

    一、瞎扯框架、架构      楼主自从1998年从C语言、MASM、Foxbase开始学计算机开始接触这个行当16年以来,2001年干第一份与程序、软件、然后是...

    魏琼东
  • InnoDB锁机制

    1. 锁类型 锁是数据库区别与文件系统的一个关键特性,锁机制用于管理对共享资源的并发访问。 InnoDB使用的锁类型,分别有: 共享锁(S)和排他锁(X) 意...

    butterfly100
  • miniblink修复3D变换的两处渲染Bug

    情况是这样的,有个群友让我试了下http://2.swiper.com.cn/demo/3dflow/index.html  里面的3D flow效果,发现mi...

    龙泉寺扫地僧
  • linux下查看磁盘分区的文件系统格式 原

    Filesystem Type 1K-blocks Used Available Use% Mounted on /dev/sda1 ext4 2064242...

    拓荒者
  • C#学习系列文章之Windows窗体应用程序003

    紧接着上一篇文章,我已经学习了控制台的使用,以及创建不同应用的Helloworld程序,这一篇文章,我介绍Windows窗体应用程序的简单实用,按照调用流程一步...

    算法发
  • scrapy的简单使用

    用户2398817

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动