在 C# 中为使用 SecretClient.GetSecret 函数的函数创建单元测试
Create Unit Test for a function in C# that uses SecretClient.GetSecret function
我很了解 Java 但我是 C# 新手。
我在为以下示例代码编写单元测试时遇到困难:
public static IDictionary<string, string> GetVaultSecretsDictionary(Uri keyVaultUrl, ChainedTokenCredential azureChainedCredential, string[] secretNames)
{
var client = new SecretClient(keyVaultUrl, azureChainedCredential);
var vaultSecrets = new Dictionary<string, string>();
foreach (var secretName in secretNames) {
Response<KeyVaultSecret> responseKeyVaultSecret = client.GetSecret(secretName);
var secretValue = responseKeyVaultSecret.Value.Value;
vaultSecrets.Add(secretName, secretValue);
}
return vaultSecrets;
}
我想为上述功能编写单元测试,但我不知道如何模拟 SecretClient 然后以我们在 [=32] 中使用 InjectMock 的类似方式注入它=].另外,为了得到responseKeyVaultSecret值,还向URL发送了一个请求,我不知道如何实现GetSecret 到 return 响应模拟值。
我一直在寻找示例和教程,但对我来说并没有什么成果。
注意:以上函数内不可修改
问题在于客户端是在方法主体中生成的,因此您实际上没有模拟它的选项。你需要将它传递给方法以实现你想要做的事情。
正如 Pawel 在上面的回答中所说,您必须在您的方法中传递 SecretClient
。然后,在你的测试中模拟它 class 并传递它以用于单元测试。例如,您可以使用 Moq:
模拟它
使用 Moq 创建测试客户端实例:
Mock<SecretClient> clientMock = new Mock<SecretClient>();
clientMock.Setup(c => c.GetSecret(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<CancellationToken>()))
.Returns(...);
clientMock.Setup(c => c.GetSecretAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<CancellationToken>()))
.ReturnsAsync(...);
SecretClient secretClient = clientMock.Object;
然后,将 clientMock.Object
作为类型 SecretClient
的参数传递给 GetVaultSecretsDictionary
方法或 class 的构造函数,然后删除 var client = new SecretClient(keyVaultUrl, azureChainedCredential);
并使用该输入参数。
查看此详细教程以获取帮助:https://devblogs.microsoft.com/azure-sdk/unit-testing-and-mocking/
我很了解 Java 但我是 C# 新手。
我在为以下示例代码编写单元测试时遇到困难:
public static IDictionary<string, string> GetVaultSecretsDictionary(Uri keyVaultUrl, ChainedTokenCredential azureChainedCredential, string[] secretNames)
{
var client = new SecretClient(keyVaultUrl, azureChainedCredential);
var vaultSecrets = new Dictionary<string, string>();
foreach (var secretName in secretNames) {
Response<KeyVaultSecret> responseKeyVaultSecret = client.GetSecret(secretName);
var secretValue = responseKeyVaultSecret.Value.Value;
vaultSecrets.Add(secretName, secretValue);
}
return vaultSecrets;
}
我想为上述功能编写单元测试,但我不知道如何模拟 SecretClient 然后以我们在 [=32] 中使用 InjectMock 的类似方式注入它=].另外,为了得到responseKeyVaultSecret值,还向URL发送了一个请求,我不知道如何实现GetSecret 到 return 响应模拟值。
我一直在寻找示例和教程,但对我来说并没有什么成果。
注意:以上函数内不可修改
问题在于客户端是在方法主体中生成的,因此您实际上没有模拟它的选项。你需要将它传递给方法以实现你想要做的事情。
正如 Pawel 在上面的回答中所说,您必须在您的方法中传递 SecretClient
。然后,在你的测试中模拟它 class 并传递它以用于单元测试。例如,您可以使用 Moq:
使用 Moq 创建测试客户端实例:
Mock<SecretClient> clientMock = new Mock<SecretClient>();
clientMock.Setup(c => c.GetSecret(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<CancellationToken>()))
.Returns(...);
clientMock.Setup(c => c.GetSecretAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<CancellationToken>()))
.ReturnsAsync(...);
SecretClient secretClient = clientMock.Object;
然后,将 clientMock.Object
作为类型 SecretClient
的参数传递给 GetVaultSecretsDictionary
方法或 class 的构造函数,然后删除 var client = new SecretClient(keyVaultUrl, azureChainedCredential);
并使用该输入参数。
查看此详细教程以获取帮助:https://devblogs.microsoft.com/azure-sdk/unit-testing-and-mocking/