2010-09-10 12 views
6

Jak można zablokować DataContext, którego używam w klasie, aby pisać wiadomości do tabeli. Chciałbym potwierdzić, że tabela, do której pisze LINQ, ma oczekiwaną liczbę wiadomości. Oto, co mam do tej pory.Moling DataContext z MS Moles?

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

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

Jeśli mogę użyć tego kodu z xUnit w mojej klasie badanego Wezmę ten wyjątek

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

Co ja tu brakuje i jak wdrożyć DataContext.Dispose() na kreta? Używam krety niezależne bez Pex.

Odpowiedz

3

Po utworzeniu nowego kreta domyślnym zachowaniem jego metod i właściwości jest wyrzucenie MoleNotImplementedException, gdy tylko zostaną wywołane.

Aby zaimplementować kreta, można wykonać context.Dispose =() => {};, co oznacza, że ​​nic się nie dzieje po wywołaniu metody Dispose na instancji molowej. Ponownie przeczytałem pytanie i prawdopodobnie masz problem, ponieważ Dispose jest zdefiniowany w klasie bazowej. Mole metodę bazową trzeba wykonać następujące czynności:

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

baseContext.Dispose =() => {}; 

Musisz wdrożyć każdą nieruchomość/metodę, która jest wywoływana przez kod badany lub można ustawić domyślne zachowanie dla instancji mol globalnie za pomocą metoda BehaveAsDefaultValue. W ten sposób każda metoda w kretu nic nie da i zwróci wartość domyślną dla tego typu, jeśli istnieje, zamiast rzucać MoleNotImplementedException. Jeśli jednak wymaga tego zachowanie, lepiej użyć kikut niż kret.

+0

Miałem ten sam problem, to jest poprawna odpowiedź. – omatase

0

Mam problem ze zrozumieniem, co robi twój test. Musiałem wczoraj zrobić coś podobnego, więc podzielę się swoim doświadczeniem. Po pierwsze, ważne jest, aby zrozumieć, że nie trzeba używać wszystkich MoleTypesów w celu przetestowania kodu - wystarczy użyć Moli, aby przekierować określone części kodu do wyrażeń lambda. Biorąc pod uwagę sposób, że robi to:

  1. uzyskać listę użytkowników, aby zmodyfikować z bazy
  2. modyfikować każdy użytkownik w zbiorze
  3. wysłać nowy zestaw z powrotem do bazy

I "Chciałbym przekierować 1 i 3, aby nie używać bazy danych. Na przykład, mogę przekierować rozmowę do SubmitChanges (3) za pomocą tego kodu:

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; 
    }; 

że (i wezwanie, aby uzyskać użytkowników) będzie jedynym Moletypes użyję w teście. Reszta będzie normalna. Następnie mogę użyć asercji, aby sprawdzić wartości changeCount, updates i hitSubmitChanges.

+1

Uwaga dla innych: MDataContext wymaga, tak jak tutaj zastosowano, wymaga utworzenia Mola dla System.Data.Linq. – sfuqua

Powiązane problemy