У меня есть следующий метод, который необходимо проверить с помощью Moq. Проблема в том, что каждый метод, вызываемый в операторе switch, является закрытым, в том числе PublishMessage в конце. Но этот метод (ProcessMessage) является общедоступным. Как я могу проверить это, чтобы я мог гарантировать, что вызовы выполняются в зависимости от параметра? Обратите внимание, что я не тестирую частные методы, я просто хочу проверить «вызовы». Я хотел бы высмеять эти частные методы и проверить, вызваны ли они с помощью программы установки, но Moq не поддерживает насмешливые частные методы.Тестирование вызовов частным методам с помощью moq
public void ProcessMessage(DispenserMessageDataContract dispenserMessage)
{
var transOptions = new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted };
using (var scope = new TransactionScope(TransactionScopeOption.RequiresNew, transOptions))
{
switch (dispenserMessage.Type)
{
case DispenserMessageType.AckNack:
UpdateAckNackMessageQueue(dispenserMessage);
break;
case DispenserMessageType.FillRequest:
CreateFillRequestMessageQueue(dispenserMessage);
break;
case DispenserMessageType.FillEvent:
UpdateFillEventMessageQueue(dispenserMessage);
break;
case DispenserMessageType.RequestInventory:
CreateRequestInventoryMessageQueue(dispenserMessage);
break;
case DispenserMessageType.ReceiveInventory:
CreateReceiveInventoryMessageQueue(dispenserMessage);
break;
}
scope.Complete();
}
PublishMessage(dispenserMessage);
}
Моя команда решила заставить меня изменить личные методы защиты. Затем я создал оболочку для тестирования класса. Единственное, что меня беспокоит, это то, что Moq (или любая насмешливая структура) заставляет меня отклоняться от лучших практик. Я считаю, что частные методы должны оставаться закрытыми. – Ray
Moq не заставляет отклоняться от лучших практик, что фактически отклоняется, так это то, что вы хотите самостоятельно проверять частные методы. В идеале тест не должен даже знать, что частные методы даже существуют. Вместо этого вы проверяете все взаимодействие, вызванное публичным методом, который вы вызываете напрямую, и все личные вещи, которые он вызывает впоследствии, то есть то, что видит вызывающий, а не детали реализации. – Alejandro