我正在使用 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
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);
这可以编译。