在 ReturnsAsync 上设置 KeyVaultSecret 的 lambda

问题描述 投票:0回答:1

我正在使用 Moq 4.18.4,并且在设置 ReturnsAsync 时遇到问题,它向我显示以下错误

ISetup>' 不包含 'ReturnsAsync' 的定义,并且最佳扩展方法重载 'SequenceExtensions.ReturnsAsync(ISetupSequentialResult>, Func)' 需要类型为 'Moq.Language.ISetupSequentialResult>>

的接收器

我知道 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# unit-testing asynchronous moq mstest
1个回答
0
投票

GetSecretAsync
方法返回一个
Task<Response<KeyVaultSecret>>
,因此为了使用
ReturnsAsync
,您必须提供一个
Response<KeyVaultSecret>
,而不仅仅是一个
KeyVaultSecret

事实证明,Response类是一个

abstract
类,因此一种选择是找到现有的派生类之一并使用它来打包
KeyVaultSecret

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

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

这可以编译。

© www.soinside.com 2019 - 2024. All rights reserved.