ITable
содержит 3 различных интерфейса: IEnumerable
, IQueryable
и другие элементы в ITable
. Поскольку все, что вы делаете, это запрашиваете таблицу, вы можете вместо этого использовать IQueryable
и передавать ее в макет / заглушку:
IQueryable<MyTable> testTable = new[]{new MyTable{…}, new MyTable{…}, …, new MyTable{…}}.AsQueryable();
myMock.Stub(x => x.GetMyTable()).Return(testTable);
каждый new MyTable{…}
будет представлять строку в таблице.
Если / когда вам нужен полный ITable
интерфейс, например поскольку вы хотите добавить или удалить строки из таблицы, вы захотите создать собственный абстрактный класс TestableTable, вы можете расширить List
(таким образом, он уже реализует IEnumerable
) и предложить все IQueryable
-методы с помощью:
public SomeType SomeMethodFromIQueryable(…)
{
return this.AsQueryable().SomeMthodFromIQueryable(…);
}
Теперь остались только другие вещи в ITable
. Их легко перевести в List
-методы, за исключением .Commit()
, который можно оставить абстрактным, а затем заглушить и .AssertWasCalled(…)
.
var myMock = MockRepository.GenerateStub<TestableTable<MyTable>>(){ new MyTable{…}, …};
…
myMock.AssertWasCalled(x => x.Commit());
Надеюсь, это поможет.
П.С .: Я сталкивался с вашим вопросом, когда искал стандартное решение для той же проблемы. Ничего не нашел, поэтому я это реализовал.