Допустим, у меня есть класс Generic Repository в соответствии со следующим:
public class Repository<T> : IRepository<T> where T : class
{
IObjectSet<T> source;
public Repository(IUnitOfWork transactionHandler)
{
source = transactionHandler.CreateObjectSet<T>();
}
public IQueryable<T> GetAll()
{
return source.AsQueryable<T>();
}
public void Add(T entity)
{
source.AddObject(entity);
}
//blah blah other methods
}
У меня возникли проблемы с тем, как (или даже если?) Я бы протестировал этот модуль.Visual Studio создает комбинацию тестов, которые я могу понять для приведенной выше реализации GetAll
public void GetAllTest()
{
GetAllTestHelper<SomeExpectedType>();//expect this to pass
try
{
GetAllTestHelper<SomeUnexpectedType>();//expect this to throw exception
}
//catch exception - check it is expected type etc.
}
public void GetAllTestHelper<T>() where T : class
{
IUnitOfWork transactionHandler = IUnitOfWorkFactory.GetUnitOfWork();
Repository<T> target = new Repository<T>(transactionHandler);
IQueryable<T> actual = target.GetAll();
Assert.IsInstanceOfType(actual, typeof(IQueryable<T>));
}
Идея в том, что я могу доказать, что вызов этого метода возвращает IQueryable типа T. Я также могу доказать, что онвыдает InvalidOperationException для типа, для которого IObjectSet не может быть сгенерирован (также необходим / желателен).
Для метода Add я иду по кругу.
Для «почему» - почемуесть тест - я думаю, что я хочу доказать, что я могу добавить тип T в хранилище, а затем доказать, что он был добавлен в БД.
Для «как» - используя VS по умолчанию, как указано вышеЯ получаю что-то вроде
public void AddTest()
{
AddTestHelper<SomeExpectedType>();
}
public void AddTestHelper<T>() where T : class
{
IUnitOfWork transactionHandler = UnitTestHelper.GetUnitOfWork();
Repository<T> target = new Repository<T>(transactionHandler);
T entity = default(T);
target.Add(entity);//throws exception - value cannot be null
}
Так что мой вопрос: а) как бы вы протестировали этот репозиторий?или, возможно, б) будет ли тестировать этот репозиторий?