ИМО, это распространенная ошибка, которую пытаются симулировать в тестах. Макет не симулятор. Он не должен реализовывать логику, аналогичную оригиналу, он должен просто возвращать жестко закодированные результаты.
Если поведение макета является сложным, вы в конечном итоге тестируете свой макет вместо своего бизнес-кода.
Я использую RhinoMocks, и это будет выглядеть так:
// arrange
IList<Record> testdata = new List<Record>() {a, b, c};
db = MockRepository.GenerateMock<IDatabase>();
db.Stub(x => db.getTable).Return(testdata);
// act: call your unit under test
// assert
db.AssertWasCalled(x => x.InsertOnSubmit(Arg<Record>.Is.Anything));
db.AssertWasCalled(x => x.SubmitChanges());
Он по-прежнему возвращает один и тот же список каждый раз. Для многих случаев этого будет достаточно. Вы все еще можете вернуть другие данные во втором вызове getTable:
db.Stub(x => db.getTable).Return(testdata1);
db.Stub(x => db.getTable).Return(testdata2);
Это всегда специфично для одного теста, но это делает его таким простым.
Edit:
Я должен признать, что я не знаком с Linq2Sql. В моем примере вызовы, которые являются поддельными, являются вызовами Linq2Sql, которые, вероятно, не могут быть смоделированы так легко. Вы, вероятно, должны поместить его в простой интерфейс DAL. Затем вы издеваетесь над этим интерфейсом.