gpt4 book ai didi

c# - 如何使用 Moq Azure Key Vault 进行单元测试

转载 作者:行者123 更新时间:2023-12-03 00:42:01 24 4
gpt4 key购买 nike

我需要模拟 Key Vault 的端点,以便知道我是否调用该函数来获取 Key Vault 一次。

我正在使用 C# 和 Moq(框架)开发此程序以便进行测试。

界面如下:

public interface IKeyVaultConnection
{
string GetKeyVaultValue(string variableName);
}
 public class KeyVaultConnection
{
public KeyVaultClient keyVaultClient;
private string endpointKeyVault;

public KeyVaultConnection(string keyVaultAddress = "DefaultEndpoint")
{
AzureServiceTokenProvider azureServiceTokenProvider = new AzureServiceTokenProvider();
keyVaultClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
endpointKeyVault = $"https://{ keyVaultAddress }.vault.azure.net";
}

private async Task<string> AsyncGetSecretValue(string keyName)
{
var secret = await keyVaultClient.GetSecretAsync($"{endpointKeyVault}/secrets/{ keyName }")
.ConfigureAwait(false);

return secret.Value;
}

public string GetKeyVaultValue(string variableName)
{
Task<string> task = Task.Run(async () => await AsyncGetSecretValue(variableName));
task.Wait();
return task.Result;
}
}

 Mock<IKeyVaultConnection> mock = new Mock<IKeyVaultConnection>();
//----->>>>>> Need to setup the endpoint
mock.Setup(x => x.GetKeyVaultValue(It.IsAny<string>())).Returns(It.IsAny<string>());
// mock.Verify(x => x.GetKeyVaultValue(It.IsAny<string>()), Times.Once());

我需要的是伪造与端点的连接,以便我调用该函数一次并且收到如下错误:

"KeyVaultErrorException: Operation returned an invalid status code 'NotFound'"

未提供端点。

如果我取消最后一行的注释 (mock.Verify(x => x.GetKeyVaultValue(It.IsAny<string>()), Times.Once());)我明白了:

"Expected invocation on the mock once, but was 0 times: 
x => x.GetKeyVaultValue(It.IsAny<string>())"

最佳答案

如果您将您的类视为只是一个不起眼的包装器,以便其他类可以依赖 ISomethingThatReturnsValues不知道KeyVaultClient然后 mock KeyVaultClient没有必要。我们只需要走到这一步。我们不需要对我们依赖的框架类进行单元测试。

换句话说,我们是否需要验证

keyVaultClient.GetSecretAsync($"{endpointKeyVault}/secrets/{ keyName }")

...实际上调用端点来获取 secret ?确实如此。这就是KeyVaultClient.GetSecretAsync(string)做。如果测试失败,我们该怎么办?我们无法修复该类。同样,如果我们沿着这条路得出合乎逻辑的结论,我们就必须测试各种各样的东西。当我们创建 List<string>并添加一个字符串,它真的被添加了吗?我们不测试这些东西,因为它们已经经过测试,因此可以合理地假设它们按预期工作。

对此的一个很好的测试是集成测试,它验证您的类是否达到了预期的效果。或者,如果另一个类依赖于此,您可以为该类编写集成测试,如果您无法从 key 保管库检索任何内容,该测试将会失败。但这不需要任何 mock 。

对类进行单元测试的部分原因是最小化它,这样它除了调用内部类之外什么都不做。在这种情况下,您可以折叠 publicprivate方法合一public方法,也许还有一个提供 async选项:

    public async Task<string> GetSecretValueAsync(string keyName)
{
return await keyVaultClient.GetSecretAsync($"{endpointKeyVault}/secrets/{ keyName }");
}

public string GetSecretValue(string keyName) => GetSecretValueAsync(keyName).Result;

现在更明显了:这个类本身并没有真正做任何需要单元测试的事情。它的有用目的是适应KeyVaultClient到您的界面 - IKeyVaultConnection这样其他类就不会直接依赖 KeyVaultClient .

关于c# - 如何使用 Moq Azure Key Vault 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55687830/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com