在返回时为 KeyVaultSecret 设置 lambdasAsync

Setting lambdas for KeyVaultSecret on ReturnsAsync

提问人:Resident Zero9999 提问时间:11/2/2023 最后编辑:Resident Zero9999 更新时间:11/3/2023 访问量:28

问:

我正在使用最小起订量 4.18.4,在设置 ReturnsAsync 时遇到问题,它向我显示以下错误

ISetup<SecretClient, Task<Response>>“不包含”ReturnsAsync“的定义,最佳扩展方法重载”SequenceExtensions.ReturnsAsync<Func>(ISetupSequentialResult<Task<Func>>, Func)“需要类型为”Moq.Language.ISetupSequentialResult<System.Threading.Tasks.Task<System.Func<Azure.Security.KeyVault.Secrets.KeyVaultSecret>>>类型的接收器。

我知道 lambda 函数应该有参数,但无论我如何尝试设置它们,我仍然得到错误结果

public async Task GetCertsFromKeyVaultAsync()
  {
      // Arrange
      string certificateName = "MyCertificate";
      string base64PrivateKey = "BASE64_PRIVATE_KEY_HERE";
      byte[] privateKeyBytes = Convert.FromBase64String(base64PrivateKey);
      X509Certificate2 expectedCertificate = new X509Certificate2(privateKeyBytes);


      // Set up the SecretClient to return the expected secret
      _mockSecretClient.Setup(client => client.GetSecretAsync(certificateName, null, CancellationToken.None))
          .ReturnsAsync(() =>
          {
              return new KeyVaultSecret(certificateName, base64PrivateKey);
          });


      // Act
      X509Certificate2 actualCertificate = await _keyVaultManager.GetCertificateFromKeyVaultAsync(certificateName);

      // Assert
      Assert.AreEqual(expectedCertificate, actualCertificate); ;
}

注意:下面是 GetSecretAsync 定义 https://learn.microsoft.com/en-us/dotnet/api/azure.security.keyvault.secrets.secretclient.getsecretasync?view=azure-dotnet

C# 单元测试 最小起订量 MSTest

评论

0赞 Mark Seemann 11/2/2023
的定义是什么?请编辑问题,使其包含一个最小的、可重现的示例GetSecretAsync
0赞 Resident Zero9999 11/3/2023
这是方法定义 learn.microsoft.com/en-us/dotnet/api/...

答:

0赞 Mark Seemann 11/3/2023 #1

该方法返回一个 ,因此为了使用 ,您必须提供 ,而不仅仅是 。GetSecretAsyncTask<Response<KeyVaultSecret>>ReturnsAsyncResponse<KeyVaultSecret>KeyVaultSecret

事实证明,Response 类是一个类,因此一种选择是查找现有的派生类之一,并使用它来打包 .abstractKeyVaultSecret

我不知道您到底想做什么,我也不知道那个 API,但另一种选择是也使用 Moq 来创建返回值:

mockSecretClient
    .Setup(client => client.GetSecretAsync(certificateName, null, CancellationToken.None))
    .ReturnsAsync(new Mock<Response<KeyVaultSecret>>().Object);

这编译了。