2010-09-10 12 views
6

Wie kann ich den DataContext, den ich in einer Klasse verwende, zum Schreiben von Nachrichten in eine Tabelle verwenden. Ich möchte behaupten, dass die Tabelle, auf die LINQ schreibt, die erwartete Anzahl von Nachrichten hat. Hier ist, was ich bisher habe.Moling DataContext mit 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()); 

Wenn ich diesen Code mit xUnit in meiner Klasse im Test verwenden werde ich diese Ausnahme erhalten

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

Was ich hier fehlt und wie DataContext.Dispose() auf der Mole zu implementieren? Ich benutze Maulwürfe ohne Pex.

Antwort

3

Wenn Sie ein neues Maulwurf erstellen, ist das Standardverhalten für seine Methoden und Eigenschaften, eine MoleNotImplementedException zu werfen, wann immer sie aufgerufen werden.

Um den Maulwurf zu implementieren, können Sie context.Dispose =() => {}; tun, was bedeutet, dass nichts passiert, wenn die Dispose-Methode auf der Moled-Instanz aufgerufen wird. Ich habe die Frage erneut gelesen und Sie haben wahrscheinlich ein Problem, da Dispose in einer Basisklasse definiert ist. Um Maulwurf Basismethode müssen Sie Folgendes tun:

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

baseContext.Dispose =() => {}; 

Sie müssen auf jede Eigenschaft/Methode implementieren, die von dem im Test befindlichen Code aufgerufen wird, oder Sie können das Standardverhalten für die Maulwurf-Instanz festgelegt global mit der Methode BehaveAsDefaultValue. Auf diese Weise wird jede Methode in dem Maulwurf nichts tun und den Standardwert für den Rückgabetyp zurückgeben, wenn einer vorhanden ist, anstatt einen MoleNotImplementedException zu werfen. Wenn Sie dieses Verhalten jedoch benötigen, ist es besser, einen Stub als einen Maulwurf zu verwenden.

+0

Ich hatte das gleiche Problem, das ist die richtige Antwort – omatase

0

Ich habe Probleme zu verstehen, was dein Test macht. Ich musste gestern etwas Ähnliches machen, also werde ich meine Erfahrung teilen. Zunächst ist es wichtig zu verstehen, dass Sie nicht alle MoleTypes zum Testen Ihres Codes verwenden müssen - Sie müssen nur Moles verwenden, um bestimmte Teile Ihres Codes an Lambda-Ausdrücke umzuleiten. Bei einem Verfahren, das tut dies:

  1. eine Liste von Benutzern erhält aus der Datenbank ändern
  2. jeden Benutzer in der Gruppe ändern
  3. den neuen Satz an die Datenbank senden zurück

I möchte 1 und 3 umleiten, um die Datenbank nicht zu verwenden. Zum Beispiel kann ich den Anruf zu SubmitChanges (3) über diesen Code umleiten:

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

Den (und den Anruf die Benutzer zu bekommen) wäre die einzige Moletypes sein, die ich im Test verwenden würde. Der Rest wäre normal. Dann kann ich Assertions verwenden, um die Werte von changeCount, updates und hitSubmitChanges zu überprüfen.

+1

Hinweis für andere: MDataContext benötigt, wie hier verwendet erfordert eine Mole für System.Data.Linq. – sfuqua