Молдинг DataContext с MS Moles? - PullRequest
       19

Молдинг DataContext с MS Moles?

6 голосов
/ 10 сентября 2010

Как я могу вычислить DataContext, который я использую в классе для записи сообщений в таблицу. Я хотел бы утверждать, что таблица, в которую пишет LINQ, содержит ожидаемое количество сообщений. Вот что у меня есть.

var context = new MJustTestingDataContext();
MyMessagewriter writer = new MyMessageWriter(context);

var messageList = new List<MIncmoingMessage>();
MTable<MIncomingMessage> messageTable = new MTable<MIncomingMessage>();
messageTable.Bind(messagesLinqList.AsQueryable());

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

Microsoft.Moles.Framework.Moles.MoleNotImplementedException: DataContext.Dispose() was not moled.

Что мне здесь не хватает и как реализовать DataContext.Dispose () на кроте? Я использую кроты без Pex.

Ответы [ 2 ]

3 голосов
/ 10 сентября 2010

Когда вы создаете новый Крот, поведение по умолчанию для его методов и свойств - бросать MoleNotImplementedException при каждом их вызове.

Для реализации крота вы можете сделать context.Dispose = () => {};, чточто ничего не происходит, когда метод Dispose вызывается в moled экземпляре. Я перечитал вопрос, и у вас, вероятно, возникла проблема, так как Dispose определен в базовом классе.Чтобы вычислить базовый метод, вам нужно сделать следующее:

var context = new MJustTestingDataContext();
var baseContext = new MDataContext(context);

baseContext.Dispose = () => {};

Вам нужно будет реализовать каждое свойство / метод, который вызывается тестируемым кодом, или вы можете установить поведение по умолчанию для экземпляра mole в глобальном масштабе.используя метод BehaveAsDefaultValue.Таким образом, каждый метод в моле ничего не будет делать и будет возвращать значение по умолчанию для своего возвращаемого типа, если таковой существует вместо броска MoleNotImplementedException.Однако, если вам требуется такое поведение, лучше использовать заглушку, чем моль.

0 голосов
/ 08 декабря 2010

У меня проблемы с пониманием того, что делает ваш тест. Я должен был сделать что-то подобное вчера, поэтому я поделюсь своим опытом. Во-первых, важно понимать, что вам не нужно использовать все типы MoleTypes для тестирования вашего кода - вам просто нужно использовать Moles, чтобы перенаправить определенные части кода в лямбда-выражения. Учитывая метод, который делает это:

  1. получить список пользователей для изменения из базы данных
  2. изменить каждого пользователя в наборе
  3. отправить новый набор обратно в базу данных

Я бы хотел перенаправить 1 и 3, чтобы не использовать базу данных. Например, я могу перенаправить вызов на SubmitChanges (3) через этот код:

bool hitSubmitChanges = false;
int changeCount = 0;
IList<object> updates = null;

// more code here... 

   // redirect DataContext.SubmitChanges() to a lambda to catch updates 
   MDataContext.AllInstances.SubmitChanges = (c) =>
   {
    changeCount = c.GetChangeSet().Updates.Count;
    updates = c.GetChangeSet().Updates;
    hitSubmitChanges = true;
   };

Это (и вызов для получения пользователей) будет единственным Moletypes, который я буду использовать в тесте. В остальном это было бы нормально. Затем я могу использовать утверждения для проверки значений changeCount, updates и hitSubmitChanges.

...