Для моих тестов мне нужно издеваться над клиентом данных, в моем случае это Oracle.
Я создал свой уровень доступа к данным, чтобы это можно было передать:
public static Int32? GetUserRoleId(string userName, OracleConnection cn, OracleCommand cmd)
Я использую Moq, хотя я могу переключиться на другую фреймворк, если это необходимо, и когда я иду создавать такие объекты Mock, как это:
Mock<OracleConnection> mockOracleConnection = new Mock<OracleConnection>();
Mock<OracleCommand> mockOracleCommand = new Mock<OracleCommand>();
Я получаю эту ошибку:
Отказ: System.ArgumentException: Тип для издевательства должен быть интерфейсом или абстрактным или незапечатанным классом.
Вывод: Это было проще, чем я думал! Просто высмеивайте функцию слоя DAL следующим образом:
mockDao.Setup(a => a.GetUserRoleId(userName, It.IsAny<OracleConnection>(), It.IsAny<OracleCommand>())).Returns(1);
Вы можете вносить изменения в использование IDbConnection и IDbCommand (использовать интерфейсы и factory для предоставления реальных объектов в основном коде и макет объектов в тесте - обычно с использованием инъекции зависимостей)
Moq может только фальсифицировать интерфейсы и виртуальные методы.