Я новичок в Moq и только что начал проект, который уже находится в разработке. Я отвечаю за настройку модульного тестирования. Там есть пользовательский класс для DatabaseFactory, который использует EnterpriseLibrary и выглядит следующим образом:MSTest с Moq - настройка DAL
public Database CreateCommonDatabase()
{
return CreateDatabaseInstance(string.Empty);
}
private static Database CreateDatabaseInstance(string foo)
{
var database = clientCode == string.Empty
? DatabaseFactory.CreateDatabase("COMMON")
: new OracleDatabase(new ClientConnections().GetConnectionString(foo)));
return database;
}
Теперь, вот где, что привыкает (ResultData другой класс типа DataSet):
public ResultData GetNotifications(string foo, string foo2, Database database)
{
var errMsg = string.Empty;
var retval = 0;
var ds = new DataSet();
var sqlClause =
@"[Some SELECT statement here that uses foo]";
DbCommand cm = database.GetSqlStringCommand(sqlClause);
cm.CommandType = CommandType.Text;
// Add Parameters
if (userSeq != string.Empty)
{
database.AddInParameter(cm, ":foo2", DbType.String, foo2);
}
try
{
ds = database.ExecuteDataSet(cm);
}
catch (Exception ex)
{
retval = -99;
errMsg = ex.Message;
}
return new ResultData(ds, retval, errMsg);
}
Теперь, первоначально , база данных не была передана в качестве параметра, но метод создавал новый экземпляр DatabaseFactory с использованием метода CreateCommonDatabase и использовал его оттуда. Однако это оставляет класс неустойчивым, потому что я не могу удержать его от фактического попадания в базу данных. Итак, я пошел с Dependency Injection и передал базу данных.
Теперь я застрял, потому что нет возможности издеваться над базой данных, чтобы протестировать GetNotifications. Мне интересно, слишком ли я усложняю вещи, или если я что-то упускаю. Правильно ли я делаю это, или я должен переосмыслить, как у меня это настроено?
Изменить, чтобы добавить больше информации *****
Я действительно не хочу, чтобы проверить базу данных. Я хочу, чтобы класс Data.Notifications (выше) возвращал экземпляр ResultData, но это все, что я действительно хочу проверить. Если я иду на уровень вверх, в бизнес-слой, у меня есть это:
public DataSet GetNotifications(string foo, string foo1, out int returnValue, out string errorMessage, Database database)
{
ResultData rd = new data.Notifications().GetNotifications(foo, foo1, database);
returnValue = rd.ResultValue;
errorMessage = rd.ErrorMessage;
return rd.DataReturned;
}
Так, первоначально, база данных не была принята в, это был класс Data.Notifications, который создал его, - но потом снова, если бы я оставил его таким образом, я бы не смог попасть в базу данных, чтобы протестировать этот объект бизнес-уровня. Я изменил весь код, чтобы передать базу данных (которая создала базовую страницу в Интернете), но теперь я просто не уверен, что делать дальше. Я думал, что я был одним отрывочным тестом от того, чтобы это разрешилось, но, по-видимому, я ошибаюсь или у меня есть ментальный блокпост на правильном пути.
В дополнение к моему тестовому коду я также хотел бы рекомендовать, чтобы вы, ребята, попытались отойти от DataSets, если еще не слишком поздно. По моему опыту, особенно нетипизированные наборы данных, как правило, производят более хрупкий код. Удачи. –
Андерсон - Я полностью согласен, но это не мой выбор, к сожалению. Мне нужно будет поговорить с архитектором в ближайшее время о внедрении Инверсии управления/зависимости от инъекций, но я думаю, что эти изменения связаны с тем, насколько я буду сотрясать вещи. –
ну, по крайней мере, вы будете голосом по какой-то причине. Я бы работал над тем, чтобы ваш код был как можно ближе к инъекции зависимостей, так что, когда вы сможете использовать инструмент Unity (или другой контейнер IoC), вы будете готовы просто перевернуть переключатель. –