Я пытаюсь проанализировать покрытие кода с помощью модульного тестирования, в настоящее время я использую библиотеку Moq для выполнения модульного тестирования, так или иначе я иду по неверному пути, хотелось бы узнать, применим ли приведенный ниже сценарий с использованием Moq
Ниже приведен фрагмент кода
public interface ISearchWorker
{
void DeleteIndex(string indexName);
T GetClient<T>();
}
public class ElasticSearchWorker : ISearchWorker
{
public void DeleteIndex(string indexName)
{
IElasticClient elasticClient = GetClient<IElasticClient>();
if (elasticClient.IndexExists(indexName).Exists)
{
_ = elasticClient.DeleteIndex(indexName);
}
}
public T GetClient<T>()
{
string nodeList = "http://localhost:9200/";
List<Node> nodes = nodeList.Split(',').Select(uri => new Node(new Uri(uri))).ToList();
IConnectionPool sniffingConnectionPool = new SniffingConnectionPool(nodes);
IConnectionSettingsValues connectionSettings = new ConnectionSettings(sniffingConnectionPool);
return (T)(IElasticClient)new ElasticClient(connectionSettings);
}
}
Ниже приведен фрагмент кода для модульного теста
[TestClass]
public class SearchTestClass
{
private ISearchWorker searchWorker;
private Mock<ISearchWorker> searchWorkerMoq;
private readonly string indexName = "testIndex";
[TestInitialize]
public void SetupElasticClient()
{
searchWorkerMoq = new Mock<ISearchWorker>();
var elasticClient = new Mock<IElasticClient>();
searchWorkerMoq.Setup(c => c.GetClient<IElasticClient>()).Returns(elasticClient.Object).Verifiable();
searchWorker = searchWorkerMoq.Object;
}
[TestMethod]
public void DeleteIndexTest()
{
try
{
searchWorker.DeleteIndex(indexName);
searchWorkerMoq.Verify(c => c.GetClient<IElasticClient>(), Times.Once());
}
catch (System.Exception)
{
throw;
}
}
}
Линия
searchWorkerMoq.Verify(c => c.GetClient<IElasticClient>(), Times.Once());
Выдает следующее исключение
(Moq.MockException: '
Expected invocation on the mock once, but was 0 times: c => c.GetClient<IElasticClient>())
При чтении большей части информации, связанной с Moq, кажется, что это неправильный способ выполнения теста Moq, объект IElasticClient должен предоставляться извне классу ElasticSearchWorker
Причина, по которой мы не предоставляем объект IElasticClient из внешнего внедрения, заключается в том, что мы планируем реализовать ISearchWorker для другого поставщика поиска (поиск Azure), поэтому мы хотели бы сохранить сущность клиента в пределах класса, реализующего интерфейс ISearchWorker
Хотелось бы узнать, есть ли лучший способ выполнить этот тест, а также как нам достичь покрытия кода для этого сценария.