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

我喜欢VS Code。 我也喜欢Azure持久功能。 而且单元测试相当不错。 将它们放在一起,您将获得……有些未知的领域。
大多数.NET Core 2单元测试原理都适用于持久功能,但还有一些补充。 特别是在仅运行Visual Studio Code的情况下。 这应该使您开始:
- 项目设置
- 包和扩展
- 依赖注入和Azure函数
- 测试耐用功能
- 运行测试
- 代码覆盖率
- 调试单元测试
项目设置
.NET单元测试应位于自己的目录中,并带有自己的项目,这是整个解决方案的所有部分。 假设您已经在src
目录中测试了一些代码,请按照以下步骤设置测试目录:
- 创建一个新目录来容纳单元测试。
test
可能是一个好名字。 - 创建一个单元测试项目
一个。 移至测试目录
b。 运行dotnet new mstest
(使用MSTest创建一个新的单元测试项目)您也可以传递NUnit
或xUnit
。
C。 将主要项目添加到此测试项目中dotnet add reference ../src/MyProject.csproj
- 返回到根目录,并将单元测试项目添加到解决方案中
dotnet sln add test/MyProject.Tests.csproj
包和扩展
您需要将以下软件包安装到单元测试项目中。
- Moq(最小起订量) —用于嘲笑和存根。
- Coverlet —用于跨平台代码覆盖
还建议您使用以下VS Code扩展:
- .NET Core Test Explorer —用于运行测试的UI
- 覆盖范围 -在VS Code中直接显示代码的覆盖行。
依赖注入和Azure函数
由于Azure函数的static
性质,它们当前不支持依赖项注入(DI)。 这是一个问题,因为DI是C#中进行单元测试所必需的。 幸运的是,有许多方法可以实现DI。 这是我发现的最简单的方法。
- 安装此软件包“包含用于依赖项注入的绑定扩展”。
- 在主项目的根目录中创建一个名为
Startup.cs
的文件,其内容如下:
3.这与正常的.NET Core项目非常相似,在该项目中,您可以在启动文件中添加单例引用。
4.请注意, ConfigureServices
是实例化抽象函数或接口的位置。 在上面的示例中,我们创建了一个ISendGridClient
实例(用于发送电子邮件)。 然后我们将其添加为单例,现在无论何时Inject
ISendGridClient
,都将传入此实例。
5.现在,单元测试可以像平常一样传递自己的类模拟:
注意:存在一个已知问题 ,它将在Azure中引发错误。 根据文档,有一种对我有效的解决方法。 将此Directory.Build.target文件放在函数应用程序的根目录中。 这将复制Azure中丢失的文件。
测试耐用功能
耐用的功能在C#世界中非常独特。 因此,应该期望对它们进行测试也是非常独特的。 当然,持久功能项目中的任何正常功能都可以像正常一样进行测试。 对于那些特定于耐用功能的功能,请按照以下步骤操作。 有关更多信息,请参见Microsoft的这篇文章。
初学者
您应该将Base
附加到DurableOrchestrationClient
参数。
现在可以DurableOrchestrationClientBase
此DurableOrchestrationClientBase
类,然后将其直接传递给启动程序函数。
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中显示覆盖线。

这需要特定的文件格式。 要创建正确的文件格式,请运行以下简短命令:
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