Модульное тестирование в репозитории с общими параметрами - PullRequest
1 голос
/ 18 июня 2011

Допустим, у меня есть класс 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
}

Так что мой вопрос: а) как бы вы протестировали этот репозиторий?или, возможно, б) будет ли тестировать этот репозиторий?

1 Ответ

2 голосов
/ 18 июня 2011

а) как бы вы протестировали этот репозиторий?

Макет фреймворка, такой как Rhino Mocks или Moq , может упростить задачу модульного тестирования этого класса.Он будет использоваться для макета интерфейса IUnitOfWork, который передается в конструктор хранилища.

Например, вот как может выглядеть типичный модульный тест метода Add для этого хранилища с использованием Rhino Mocks:

[TestMethod]
public void Add_Should_Use_AddObject_On_Underlying_Source()
{
    // arrange
    var uofStub = MockRepository.GenerateStub<IUnitOfWork>();
    var objectSet = MockRepository.GenerateStub<IObjectSet<string>>();
    uofStub.Stub(x => x.CreateObjectSet<string>()).Return(objectSet);
    var sut = new Repository<string>(uofStub);
    var entity = "foo bar";

    // act
    sut.Add(entity);

    // assert
    objectSet.AssertWasCalled(x => x.AddObject(entity));
}

Что касается автоматической комбинации тестов, сгенерированных Visual Studio, ИМХО, это, вероятно, одна из самых бесполезных функций в VS.

b) вы быпроверить этот репозиторий?

Да, абсолютно.

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