如何使用Dapr进行单元测试



我有一个类正在尝试进行单元测试,但它使用了一个DaprClient对象(来自SDK(,它在我的单元测试环境中不起作用。我想创建一个mock并使用它,但DaprClient实现的唯一接口是IDisposable。

有没有一种方法可以为单元测试模拟DaprClient?

我能想到的唯一解决方案是将DaprClient包装在一个带有接口的类中,并在任何地方使用这个包装器。这感觉真的很乱,每次我想在DaprClient上使用新方法时都需要更新包装器。

我对其他可能绕过这个问题的解决方案持开放态度,但我更喜欢用mock类型的简单替换方法。

我在Windows上的Visual Studio 2019中使用.Net 5、xUnit和Moq(尽管一些团队成员使用Mac,所以它需要在这两个平台上工作(。

在这个特定的例子中,我使用的是DaprClient.GetBulkSecretAsync方法,但如果可能的话,我想要一个可以在其他地方使用的解决方案。

您需要使用中的两个选项之一

  • 一个mocking框架,它在基于具体类生成mock对象时使用垫片。来自visualstudioenterprise和其他付费框架的赝品都有。很少有开源框架可以选择。Pose是一个可以通过Shimmy选择的姿势
  • 将类包装在一个使用可以用于嘲讽的接口的类中(最坏的可能性(
using Dapr.Client;
using FluentAssertions;
using Moq;
[TestMethod("How to mock GetBulkSecretAsync - 68362431")]
public async Task TestMethod1()
{
//arrange
var daprClient = new Mock<DaprClient>();
var exampleService = new ExampleService(daprClient.Object);
daprClient.Setup(d => d.GetBulkSecretAsync("my-store",
It.IsAny<IReadOnlyDictionary<string, string>>(),
It.IsAny<CancellationToken>()))
.ReturnsAsync(new Dictionary<string, Dictionary<string, string>>
{
{
"example",
new Dictionary<string, string>
{
{ "i don't understand the builk API (yet)", "some value" }
}
}
});
//act
var actual = await exampleService.GetBulkSecrets("my-store");
//assert
actual.Should().BeEquivalentTo(new Dictionary<string, Dictionary<string, string>>
{
{
"example",
new Dictionary<string, string>
{
{ "i don't understand the builk API (yet)", "some value" }
}
}
});
}

参考:

  • 完整项目
  • 使用Dapr.NETSDK访问Daprsecrets构建块

但我想要一个可以在其他地方使用的解决方案,如果可能的话,

通常,我们需要使用在DarpClient中定义的抽象方法。

相关内容

  • 没有找到相关文章

最新更新