Как издеваться над System.Data.Linq.Table <MyClass> - PullRequest
7 голосов
/ 22 ноября 2010

Один из моих базовых классов репозитория содержит метод:

public abstract class RepositoryBase<T, TDb> : IRepository<T>
    where T : IEntity
    where TDb : class, IDbEntity, new()
{
    protected internal abstract Table<TDb> GetTable();
    ...
}

Я пишу модульный тест для производного класса репозитория, который содержит реализацию упомянутого метода:

public class CmOptionRepository : 
    RepositoryBase<ICmOption, CMCoreDAL.DbData.CMOption>, ICmOptionRepository
{
    protected internal override System.Data.Linq.Table<CMCoreDAL.DbData.CMOption>
        GetTable()
    {
        return Context.CMOptions;
    }

....
}

Здесь: Контекст- это Linq-модель БД, CMOptions - одна из таблиц БД.

Я хочу, чтобы мой метод GetTable () возвращал специальный набор данных.

Я собираюсь смоделировать метод:

        System.Data.Linq.Table<CMCoreDAL.DbData.CMOption> table = ...;
        Mock<CmOptionRepository> mockRepository =
            new Mock<CmOptionRepository>(MockBehavior.Strict);
        mockRepository.Setup(mock => mock.GetTable()).Returns(table);

Но не знаю, как создать экземпляр класса System.Data.Linq.Table<CMCoreDAL.DbData.CMOption>.

Вопрос: как я могуиздеваться над System.Data.Linq.Table<>?Или, возможно, мне нужно изменить сигнатуру метода, чтобы избежать использования System.Data.Linq.Table<> класса?

Пожалуйста, сообщите.Любые мысли приветствуются.

PS Я использую Moq.

Ответы [ 4 ]

7 голосов
/ 22 ноября 2010

Если вы используете .NET 4.0, Table<T> реализует ITable<T>, так что вы должны использовать интерфейс ITable<TDb> в типе возврата GetTable вместо конкретного типа.Затем вы можете смутить.

В .NET 3.5 это немного сложнее, потому что Table<T> реализует только ITable (не универсально).

2 голосов
/ 22 ноября 2010

Вы не должны действительно выставлять Table<T> за пределами своего репозитория, если нет явной необходимости выполнять операции с экземпляром Table<T>.Вместо этого верните IQueryable<T> в свой репозиторий, который легче подделать.Если вам нужно выполнить обновления, вы можете вернуть ITable<T>.

0 голосов
/ 27 ноября 2010

Абстрагируйте ваш код доступа к данным и используйте шаблон хранилища.

0 голосов
/ 23 ноября 2010

Полагаю, вот решение:

  1. Контекст фиктивных данных:

    IUnityContainer container = new UnityContainer();
    
    Mock<IDataContext> mockDataContext = new Mock<IDataContext>();
    
    container.RegisterInstance(mockDataContext.Object);
    
    CmOptionRepository mockRepository = new CmOptionRepository(container);
    
  2. Таблица возврата макетов:

    Mock<System.Data.Linq.Table<CMCoreDAL.DbData.CMOption>> mockTable = new Mock<System.Data.Linq.Table<CMCoreDAL.DbData.CMOption>>();
    
    mockDataContext.Setup(mock => mock.CMOptions).Returns(mockTable.Object);
    
  3. Макет функциональности объекта «таблица»:

    mockTable
        .Setup(mock => mock.Select(
             It.IsAny<Func<CMCoreDAL.DbData.CMOption, ICmOption>>()
        ))
        .Returns(options);
    

Если честно, я не уверен, будет ли это работать, проверю завтра, нотеперь он хотя бы скомпилирован.

...