在 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/