当前位置: 首页 > news >正文

温州专业手机网站制作哪家好小程序在线制作平台

温州专业手机网站制作哪家好,小程序在线制作平台,企业宣传视频制作公司,装修设计灵感网站Source Generator 单元测试IntroSource Generator 是 .NET 5.0 以后引入的一个在编译期间动态生成代码的一个机制#xff0c;介绍可以参考 C# 强大的新特性 Source GeneratorGetStarted使用起来还算比较简单的#xff0c;我平时一般用 xunit#xff0c;所以下面的示例也是使… Source Generator 单元测试IntroSource Generator 是 .NET 5.0 以后引入的一个在编译期间动态生成代码的一个机制介绍可以参考 C# 强大的新特性 Source GeneratorGetStarted使用起来还算比较简单的我平时一般用 xunit所以下面的示例也是使用 xunit 来写单元测试微软提供的测试组件也有针对 MsTest 和 NUnit 的可以根据自己需要进行选择 https://www.nuget.org/packages?qMicrosoft.CodeAnalysis.CSharp.SourceGenerators.Testing我的项目是 xunit , 所以首先需要在测试项目中引用 Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.XUnit 这个 NuGet 包如果不是 xunit 选择对应的 NuGet 包即可如果在还原包的时候有包版本的警告可以显式指定对应包的版本来消除警告Sample1首先来看一个最简单的 Source Generator 示例[Generator] public class HelloGenerator : ISourceGenerator {public void Initialize(GeneratorInitializationContext context){// for debugging// if (!Debugger.IsAttached) Debugger.Launch();}public void Execute(GeneratorExecutionContext context){var code  namespace HelloGenerated {public class HelloGenerator{public static void Test()  System.Console.WriteLine(Hello Generator);} };context.AddSource(nameof(HelloGenerator), code);} }这个 Source Generator 就是一个比较简单的生成一个 HelloGenerator 的类这个类里只有一个 Test 的静态方法单元测试方法如下[Fact] public async Task HelloGeneratorTest() {var code  string.Empty;var generatedCode  namespace HelloGenerated {public class HelloGenerator{public static void Test()  System.Console.WriteLine(Hello Generator);} };var tester  new CSharpSourceGeneratorTestHelloGenerator, XUnitVerifier(){TestState {Sources  { code },GeneratedSources {(typeof(HelloGenerator), ${nameof(HelloGenerator)}.cs, SourceText.From(generatedCode, Encoding.UTF8)),}},};await tester.RunAsync(); }通常来说 Source Generator 的测试分为两部分一部分是源代码一部分 Generator 生成的代码而这个示例比较简单其实和源代码没有关系可以没有源代码上面是给了一个空也可以不配置 Sources而 Generated Sources 则是由我们的 Generator 生成的代码首先我们需要创建一个 CSharpSourceGeneratorTest 有两个泛型类型第一个是 Generator 类型第二个是验证器这和你使用哪个测试框架有关系xunit 就固定是 XUnitVerifier 在 test 中指定 TestState 中的源代码和生成的源代码之后调用 RunAsync 方法就可以了上面有一个生成的示例第一个参数是 Generator 的类型会根据 Generator 的类型获取生成代码的位置第二个参数是在 Generator 里 AddSource 时指定的名称但是这里需要注意的是即使指定的名称不是 .cs 结尾的需要也需要在这里添加 .cs 后缀这个地方感觉可以优化一下自动加 .cs 后缀第三个参数就是实际生成的代码了Sample2接着我们来看一个稍微复杂一些的和源代码有关系并且有依赖项Generator 定义如下[Generator] public class ModelGenerator : ISourceGenerator {public void Initialize(GeneratorInitializationContext context){// Debugger.Launch();context.RegisterForSyntaxNotifications(()  new CustomSyntaxReceiver());}public void Execute(GeneratorExecutionContext context){var codeBuilder  new StringBuilder( using System; using WeihanLi.Extensions;namespace Generated {public class ModelGenerator{public static void Test(){Console.WriteLine(-- ModelGenerator --); );if (context.SyntaxReceiver is CustomSyntaxReceiver syntaxReceiver){foreach (var model in syntaxReceiver.Models){codeBuilder.AppendLine($      {model.Identifier.ValueText} Generated.Dump(););}}codeBuilder.AppendLine(    });codeBuilder.AppendLine(  });codeBuilder.AppendLine(});var code  codeBuilder.ToString();context.AddSource(nameof(ModelGenerator), code);} }internal class CustomSyntaxReceiver : ISyntaxReceiver {public ListClassDeclarationSyntax Models { get; }  new();public void OnVisitSyntaxNode(SyntaxNode syntaxNode){if (syntaxNode is ClassDeclarationSyntax classDeclarationSyntax){Models.Add(classDeclarationSyntax);}} }单元测试方法如下[Fact]public async Task ModelGeneratorTest(){var code   public class TestModel123{} ;var generatedCode   using System; using WeihanLi.Extensions;namespace Generated {public class ModelGenerator{public static void Test(){Console.WriteLine(-- ModelGenerator --);TestModel123 Generated.Dump();}} } ;var tester  new CSharpSourceGeneratorTestModelGenerator, XUnitVerifier(){TestState {Sources  { code },GeneratedSources {(typeof(ModelGenerator), ${nameof(ModelGenerator)}.cs, SourceText.From(generatedCode, Encoding.UTF8)),}},};// references// TestState.AdditionalReferencestester.TestState.AdditionalReferences.Add(typeof(DependencyResolver).Assembly);// ReferenceAssemblies//    WithAssemblies//tester.ReferenceAssemblies  tester.ReferenceAssemblies//    .WithAssemblies(ImmutableArray.Create(new[] { typeof(DependencyResolver).Assembly.Location.Replace(.dll, , System.StringComparison.OrdinalIgnoreCase) }))//    ;//    WithPackages//tester.ReferenceAssemblies  tester.ReferenceAssemblies//    .WithPackages(ImmutableArray.Create(new PackageIdentity[] { new PackageIdentity(WeihanLi.Common, 1.0.46) }))//    ;await tester.RunAsync();}大体上和前面的示例差不多比较大的差异在于这里需要处理依赖项上面代码中提供的三种处理方式其中 WithPackages 方式只支持 NuGet 包方式如果是直接引用的 dll 可以使用前面两种方式来实现More在之前的介绍文章中我们推荐在代码里添加一句 Debugger.Launch() 来调试 Source Generator而有了单元测试之后我们就可以不需要这个了debug 我们的测试用例也可以调试我们的 Generator很多时候就会比较方便也不需要编译的时候触发选择 Debugger 了会更加高效一些代码里可以少一些神奇的 Debugger.Launch() 了更加推荐使用单元测试的方式来测试 Generator上面的第二个示例依赖项的处理踩了好多坑自己试了好多次都不行Google/StackOverflow 大法好除了上面的 WithXxx 方式我们还可以用 AddXxx 方式Add 是增量的方式而 With 是完全的替换掉对应的依赖如果你的项目里也有用到 Source Generator不妨试一下上面示例的代码可以从 Github 上获取https://github.com/WeihanLi/SamplesInPractice/blob/master/SourceGeneratorSample/SourceGeneratorTest/GeneratorTest.csReferenceshttps://stackoverflow.com/questions/65550409/adding-reference-assemblies-to-roslyn-analyzer-code-fix-unit-testshttps://www.thinktecture.com/en/net/roslyn-source-generators-analyzers-code-fixes-testing/https://github.com/dotnet/roslyn/blob/main/docs/features/source-generators.cookbook.md#unit-testing-of-generatorshttps://github.com/dotnet/roslyn-sdk/tree/main/src/Microsoft.CodeAnalysis.Testinghttps://www.nuget.org/packages/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.XUnit/https://github.com/WeihanLi/SamplesInPractice/blob/master/SourceGeneratorSample/SourceGeneratorTest/GeneratorTest.csC# 强大的新特性 Source Generator使用 Source Generator 代替 T4 动态生成代码使用 Source Generator 自动生成 WEB API
http://www.yutouwan.com/news/190583/

相关文章:

  • 文化传播公司网站模版浙江交工宏途交通建设有限公司网站
  • 可以做公众号背景图的网站网站建设公司 技术评估
  • asp 大型网站开发企业网站注销流程
  • 公司网站域名查询通化市建设工程招投标网站
  • 上饶招聘网站建设公司百度网盘官网登陆入口
  • 网站推广软件下载安装免费全国企业信息公示官网
  • 网站建设 运维 管理包括大型门户网站模板
  • 做群头像的网站在线做网站之前要先购买服务器吗
  • 重庆茶叶网站建设做网站的上海市哪家技术好
  • 网站制作老了ppt免费模板下载网站有哪些
  • 建站软件排行榜app广告联盟
  • 自己建一个外贸网站应用商店下载app软件
  • 兰溪市建设局官方网站优化搜索点击次数的方法
  • 找人开发一个网站多少钱wordpress 订阅插件
  • 京鑫建设集团网站怎么用网吧电脑做网站服务器吗
  • 怎么做html5网站吗网页设计大赛策划书
  • 做外贸网站 怎么收钱做婚庆网站的功能定位
  • 网站模板炫酷淘宝运营工作内容
  • 顺德医疗网站建设专业的外贸行业网站制作
  • 网站建设收税网站备案类型有哪些
  • 正规网站建设团队是什么wordpress 系统环境
  • 建站仅向商家提供技术服务wordpress缩略图地址
  • 做58同城这样的网站有哪些如何美化wordpress页面
  • 奖励软件下载网站站长网站的优势
  • 丽水公司做网站网站后台密码忘记了
  • 谭谭心怎么建设网站wordpress 代码解读
  • 网站后台如何登陆盐山网站建设
  • jsp网站开发实训报告网站建设的素材处理方式
  • 建筑图纸网站哪个酒店网站做的好看的
  • 腾讯建设网站首页怎么做有趣视频网站