Если вы рассматриваете свой класс просто как скромную оболочку, так что другие классы могут зависеть от ISomethingThatReturnsValues
, не зная о KeyVaultClient
, тогда насмешка KeyVaultClient
не нужна.Нам нужно только пойти так далеко.Нам не нужно тестировать базовые классы, от которых мы зависим.
Другими словами, нужно ли проверять, что
keyVaultClient.GetSecretAsync($"{endpointKeyVault}/secrets/{ keyName }")
... на самом деле вызывает конечную точку для получения секрета?Оно делает.Вот что делает KeyVaultClient.GetSecretAsync(string)
.Если тест не пройден, что мы можем сделать?Мы не можем исправить этот класс.Точно так же, если бы мы пошли по этому пути до его логического завершения, нам пришлось бы тестировать все виды вещей.Когда мы создаем List<string>
и добавляем строку, действительно ли она добавляется?Мы не тестируем эти вещи, потому что они уже протестированы, поэтому разумно предположить, что они работают должным образом.
Хорошим тестом для этого будет интеграционный тест, который проверяет, что ваш класс выполняет то, что ожидал.Или, если от этого зависит другой класс, вы можете написать интеграционный тест для этого класса, который не будет выполнен, если вы не сможете извлечь что-либо из хранилища ключей.Но это не потребовало бы насмешек.
Частично для удобства работы с , а не модульным тестированием класса это сводит его к минимуму, так что он действительно ничего не делает, кроме вызова внутреннего класса.В этом случае вы можете свернуть ваш метод public
и private
в один метод 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
.