Я новичок в Moq и только начал проект, который уже находится в разработке. Я отвечаю за настройку юнит-тестирования. Для DatabaseFactory существует специальный класс, который использует EnterpriseLibrary и выглядит следующим образом:
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, но с другой стороны, если я оставлю ее таким образом, я не смогу поразить базу данных, чтобы проверить этот бизнес слой объекта. Я изменил весь код для передачи базы данных (которая создается на базовой странице в Интернете), но сейчас я просто не уверен, что делать дальше. Я думал, что прошел один юнит тест для решения этой проблемы, но, видимо, либо я ошибаюсь, либо у меня есть умственное препятствие на правильном пути.