2010-02-02 16 views
12

È possibile modificare un parametro di chiamata di un metodo di simulazione? In particolare, sto cercando di modificare buffer nell'esempio seguente in un array di byte pre-compilato.Come modificare un parametro di chiamata di un metodo simulato con Moq?

Esempio:
int MockedClass.Read(byte[] buffer, int offset, int count)

Spiegazione:
Calling Read carichi count byte leggendo da offset nell'array di byte fornito buffer.

Ora mi piacerebbe avere il buffer popolato dopo che la chiamata a Read è stata effettuata nel mio codice applicazione. È possibile?

In caso affermativo, come dovrei andare per le chiamate successive a Read? Vorrei che le chiamate successive restituiscano un buffer diverso ogni volta se possibile.

EDIT:

utilizzando il comando Setup in questo modo:

MockedClass.Setup(x => x.Read(It.IsAny<byte[]>(), It.IsAny<int>(), It.IsAny<int>()).Callback((byte[] buffer, int offset, int count) => buffer[0] = 0xAA);

mi dà un problema strano durante l'esecuzione del test di unità: Una volta che la chiamata a Read è fatto e il codice delegato (buffer[0] = 0xAA) viene eseguito il debugger mostra che buffer è in realtà null e l'esecuzione del test dell'unità si interrompe dopo l'esecuzione di questo comando. La mia sintassi è borked o è un bug?

risposta

14

È possibile utilizzare il metodo di richiamata. Qualcosa di simile (dalla memoria):

var buffer = new byte[64]; 
// ... 
mock.Setup(m => m.Read(buffer, offset, count)) 
    .Callback((buffer, offset, count) => /* fill in buffer here */); 
+0

Ciao Mark. Grazie per la risposta. Se utilizzo questo modello, il mio test unitario si interromperà proprio nel punto della richiamata quando viene eseguito il delegato. Il debug del problema ha mostrato che l'array del byte del buffer è 'null'. Qualche idea per cui ciò potrebbe accadere? –

+0

È nullo a meno che non lo si assegni. La suddetta chiamata di installazione non * assegna * la variabile del buffer - corrisponde a una variabile esistente. Nella tua modifica hai corrispondenza su 'It.IsAny ()', ma il chiamante deve ancora fornire il valore. –

Problemi correlati