Как я могу издеваться над OracleConnection и OracleCommand? - PullRequest
7 голосов
/ 16 сентября 2010

Для моих тестов мне нужно смоделировать клиент данных, в моем случае это 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);

Ответы [ 2 ]

12 голосов
/ 16 сентября 2010

Вы можете внести изменения, чтобы использовать IDbConnection и IDbCommand (использовать интерфейсы и иметь фабрику для предоставления реальных объектов в основном коде и фиктивных объектов в тесте - обычно с помощью внедрения зависимостей)

Moq может только макетироватьвиртуальные методы.

0 голосов
/ 16 сентября 2010

Вы пытаетесь издеваться над закрытым классом: вы можете посмотреть на здесь .

Кстати: как сказал @Aliostad , такой фреймворк - большинство фальшивых фреймворков, которые я тоже видел - может имитировать только интерфейсы / абстрактные классы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...