使用VS代码对持久功能进行单元测试的完整指南

依赖注入,代码覆盖率,调试等

我喜欢VS Code。 我也喜欢Azure持久功能。 而且单元测试相当不错。 将它们放在一起,您将获得……有些未知的领域。

大多数.NET Core 2单元测试原理都适用于持久功能,但还有一些补充。 特别是在仅运行Visual Studio Code的情况下。 这应该使您开始:

  • 项目设置
  • 包和扩展
  • 依赖注入和Azure函数
  • 测试耐用功能
  • 运行测试
  • 代码覆盖率
  • 调试单元测试

项目设置

.NET单元测试应位于自己的目录中,并带有自己的项目,这是整个解决方案的所有部分。 假设您已经在src目录中测试了一些代码,请按照以下步骤设置测试目录:

  1. 创建一个新目录来容纳单元测试。 test可能是一个好名字。
  2. 创建一个单元测试项目
    一个。 移至测试目录
    b。 运行dotnet new mstest (使用MSTest创建一个新的单元测试项目)您也可以传递NUnitxUnit
    C。 将主要项目添加到此测试项目中dotnet add reference ../src/MyProject.csproj
  3. 返回到根目录,并将单元测试项目添加到解决方案中dotnet sln add test/MyProject.Tests.csproj

包和扩展

您需要将以下软件包安装到单元测试项目中。

还建议您使用以下VS Code扩展:

依赖注入和Azure函数

由于Azure函数的static性质,它们当前不支持依赖项注入(DI)。 这是一个问题,因为DI是C#中进行单元测试所必需的。 幸运的是,有许多方法可以实现DI。 这是我发现的最简单的方法。

  1. 安装软件包“包含用于依赖项注入的绑定扩展”。
  2. 项目的根目录中创建一个名为Startup.cs的文件,其内容如下:

3.这与正常的.NET Core项目非常相似,在该项目中,您可以在启动文件中添加单例引用。

4.请注意, ConfigureServices是实例化抽象函数或接口的位置。 在上面的示例中,我们创建了一个ISendGridClient实例(用于发送电子邮件)。 然后我们将其添加为单例,现在无论何时Inject ISendGridClient ,都将传入此实例。

5.现在,单元测试可以像平常一样传递自己的类模拟:

注意:存在一个已知问题 ,它将在Azure中引发错误。 根据文档,有一种对我有效的解决方法。 将此Directory.Build.target文件放在函数应用程序的根目录中。 这将复制Azure中丢失的文件。

测试耐用功能

耐用的功能在C#世界中非常独特。 因此,应该期望对它们进行测试也是非常独特的。 当然,持久功能项目中的任何正常功能都可以像正常一样进行测试。 对于那些特定于耐用功能的功能,请按照以下步骤操作。 有关更多信息,请参见Microsoft的这篇文章。

初学者

您应该将Base附加到DurableOrchestrationClient参数。

现在可以DurableOrchestrationClientBaseDurableOrchestrationClientBase类,然后将其直接传递给启动程序函数。

HTTP启动器

HTTP启动器有一个HttpRequestMessage参数,这很难模拟(完全)! 请参阅示例TestHelper文件,该文件在此Gist中进行了必要的设置。

一旦有了SetupHttp函数,就可以在此完整示例中按以下方式使用它:

管弦乐队

您应该将Base附加到DurableOrchestrationContext参数。

现在可以DurableOrchestrationContextBase类进行DurableOrchestrationContextBase ,然后将其直接传递给Orchestrator函数。

活动项目

活动可以像其他任何.NET函数一样进行测试。 尽管有ActivityTrigger装饰器,但您仍可以照常传递参数

您可以直接像往常一样直接传递MyClass模型。 如果碰巧直接使用DurableActivityContext而不是模型,例如:

当前没有可以模拟的Base类。 但这当前在持久功能的dev分支中。 确保需要DurableActivityContext ,您可以直接使用模型。 如果没有,强硬😃。 它来了!

运行测试

进入测试目录后, dotnet test是运行测试的最简单方法。 您也可以运行dotnet watch test并且每次更改文件都会重新运行测试。

如果您不喜欢输入,则可以使用VS Code创建任务。 打开tasks.json并添加以下JSON代码段。 确保将MyProject内容替换为项目的位置。

然后,您可以打开VS Code命令面板并运行“任务:运行测试任务”

代码覆盖率

代码覆盖率内置于.NET Core中,但不适用于跨平台。 我们将使用之前安装的Coverlet软件包。 要在启用代码覆盖率的情况下运行dotnet test /p:CollectCoverage=true ,可以运行dotnet test /p:CollectCoverage=true

我们之前安装的Coverage Gutters扩展可以在VS Code中显示覆盖线。

摘自斯科特·汉塞尔曼(Scott Hanselman)关于覆盖面文章

这需要特定的文件格式。 要创建正确的文件格式,请运行以下简短命令:

dotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=lcov /p:CoverletOutput=./lcov.info

这只是告诉dotnet收集coverage并以lcov格式创建它,这是Coverage Gutters要求的。 然后,您可以使用命令面板并运行“覆盖面沟槽:显示覆盖率”或“覆盖面沟槽:观察”。 Watch很酷,因为它会随着添加测试而自动更新。 与dotnet watch test结合使用,一切都非常好且自动化。

调试单元测试

调试很有趣,而且很必要。 在上述所有有趣的事物上,它的表现都不太好,但仍然可行。

首先,您需要一个调试命令来附加到进程。 打开launch.json并添加新配置:

这将使您可以将VS Code调试器附加到任何进程。 让我们为此准备VS Code。

  • 运行命令export VSTEST_HOST_DEBUG=1 。 这告诉VS代码准备好进行一些调试。
  • 运行dotnet test
  • 而不是运行测试,它将等待您附加到该过程:
Host debugging is enabled. Please attach debugger to testhost process to continue.
Process Id: 60143, Name: dotnet
  • 从调试选项卡运行.NET Core Attach命令。 选择前面显示的进程ID(在本示例中为60143 )。
  • 差不多好了。 所有这些都可以使您建立联系,但还没有完全融入您的测试中。 在“调用堆栈”选项卡的上方,您应该看到“断点暂停<<名称>”的内容。
  • 单击“在断点处暂停”,现在您可以在调试器中单击“继续”,您将被带到设置的第一个断点!
  • 解决问题后,可以运行export VSTEST_HOST_DEBUG=0以恢复正常。

结论

而已! 希望您发现这有帮助。 有点,但是只需一点点设置,您就可以在VS Code中完成您想要做的任何事情,以对持久功能进行单元测试。

From: https://hackernoon.com/complete-guide-to-unit-testing-durable-functions-with-vs-code-46d343789c75

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值