2012-10-31 20 views
5

Voglio eseguire il looping di un XmlNodeList. Come si fa beffe di un XmlNodeList in Moq, in modo da poter ciclo attraverso di essa come in un ciclo foreach:Mocking foreach loop con Moq

 foreach (XmlNode xmlNode in nodes) 
     { 
      //Do something with node 
     } 

ho cercato di impostare tramite un metodo del SetupSequence, ma non sono stato in grado di creare la falso desiderato.

+1

È difficile capire cosa si sta cercando di ottenere con questo test, tuttavia si consiglia di prendere in considerazione un test di integrazione piuttosto che un test unitario, fornendo una rappresentazione di stringa del proprio xml e testando il loop su reale dati. – nieve

+0

Hai ragione sul fatto che io sia in quella zona grigia, dove puoi discutere il valore di un vero test unitario. Tuttavia, questo potrebbe essere utile in altre aree non così grigie. Non incontrerò lo stesso problema con tutti i cicli foreach? – Morten

+0

La differenza è ciò che stai collegando - un documento XML è più complesso di qualsiasi altro insieme e quindi potrebbe non essere il miglior candidato per un semplice test unitario, ovviamente a seconda di cosa stai provando a testare esattamente. Inoltre, questa domanda potrebbe essere un buon indicatore per ripensare il tuo design? Solo un pensiero. – nieve

risposta

9

I foreach chiamate GetEnumerator sotto il cofano ed è quello che è necessario prendere in giro:

var xmlNodesMock = new Mock<XmlNodeList>(); 
xmlNodesList 
    .Setup(l => l.GetEnumerator()) 
    .Returns(new XmlNode[] { /* values go here */ }.GetEnumerator()); 

Naturalmente è necessario inizializzare XmlNode matrice in Returns metodo con i valori effettivi. Tieni presente che l'elenco fittato deve essere iniettabile per il metodo testato, in modo da poter sostituire l'effettiva implementazione.