2010-09-10 12 views
6

Come posso usare il DataContext che sto utilizzando in una classe per scrivere messaggi su una tabella. Mi piacerebbe affermare che la tabella che LINQ sta scrivendo ha il conteggio previsto dei messaggi. Ecco cosa ho finora.Moling DataContext con 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()); 

Se io uso questo codice con xUnit nella mia classe in prova Prendo questa eccezione

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

Che cosa mi manca qui e come implementare DataContext.Dispose() sulla talpa? Sto usando talpe standalone senza Pex.

risposta

3

Quando si crea un nuovo Talpa, il comportamento predefinito per i suoi metodi e proprietà è quello di lanciare un MoleNotImplementedException ogni volta che vengono chiamati.

Per implementare la talpa si può fare context.Dispose =() => {}; il che significa che non succede nulla quando il metodo viene chiamato Dispose sull'istanza moled. Rileggo la domanda e probabilmente stai riscontrando un problema dal momento che Dispose è definito in una classe base. Mole metodo di base è necessario effettuare le seguenti operazioni:

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

baseContext.Dispose =() => {}; 

Avrai bisogno di implementare tutte le proprietà/metodo che viene chiamato dal codice in prova oppure è possibile impostare il comportamento predefinito per l'istanza mole utilizzando globalmente il metodo BehaveAsDefaultValue. In questo modo ogni metodo nella talpa non farà nulla e restituirà il valore predefinito per il suo tipo di ritorno se ne esiste uno invece di lanciare un MoleNotImplementedException. Tuttavia, se hai bisogno di questo comportamento, è meglio usare uno stub piuttosto che una talpa.

+0

Ho avuto lo stesso problema, questa è la risposta corretta – omatase

0

Non riesco a capire cosa sta facendo il test. Ho dovuto fare qualcosa di simile ieri, quindi condividerò la mia esperienza. Innanzitutto, è importante capire che non è necessario utilizzare tutti i MoleTypes per testare il codice: è sufficiente utilizzare Moles per reindirizzare determinate parti del codice alle espressioni lambda. Dato un metodo che fa questo:

  1. ottenere un elenco di utenti di modificare dal database
  2. modificare ogni utente nel set
  3. inviare il nuovo set di nuovo al database

I 'Mi piacerebbe reindirizzare 1 e 3 per non usare il database. Ad esempio, posso reindirizzare la chiamata a SubmitChanges (3) tramite questo codice:

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

That (e la chiamata per ottenere gli utenti) sarebbe l'unico Moletypes userei nel test. Il resto sarebbe normale. Quindi posso usare le asserzioni per verificare i valori di changeCount, updates e hitSubmitChanges.

+1

Nota per altri: MDataContext richiede come usato qui richiede la creazione di un Mole per System.Data.Linq. – sfuqua