2010-10-21 7 views
9

Ho esteso gli oggetti di tipo IDataReader con alcuni metodi di estensione che mi servivano. Il problema è ora che quando provo a prendere in giro l'IDataReader, il metodo esteso non è incluso nella simulazione, quindi quando viene raggiunta la riga Expect.Call(reader.ExtensionMethod()).Return(someValue) viene eseguito il ExtensionMethod che non è quello che voglio! Voglio che quella chiamata sia registrata e quando il metodo di estensione è chiamata da un'altra parte, voglio che restituisca someValue.Come simulare i metodi di estensione con Rhino Mock?

Qualcuno sa come aggirare questo?

+2

possibile duplicato di [Come utilizzare il Moq per simulare un metodo di estensione?] (Http://stackoverflow.com/questions/562129/how-do-i-use-moq-to-mock-an-extension- metodo) – abatishchev

+1

@abatishchev: direi sia sì che no :). L'argomento che stai suggerendo non risponde se è possibile o meno per RhinoMock, e abbiamo anche l'aspetto del tempo ... qualcuno potrebbe aver trovato una soluzione intelligente a questo negli ultimi 18 mesi. –

risposta

2

La risposta sembra essere no al momento. Per il male però, ma ho risolto il mio problema con la scrittura di una classe di simulazione per la mia interfaccia, volevo invece prendere in giro. Dal momento che non avevo bisogno di molti metodi dell'interfaccia è andato abbastanza veloce.

+6

Quindi non so perché non hai accettato la risposta di Slavo mentre lui dice lo stesso ed è stato il primo :) –

13

Divulgazione: Lavoro per Telerik.

I metodi di estensione sono in realtà metodi statici nascosti come metodi di istanza. RhinoMock non può prendere in giro metodi statici e non è possibile farlo, a meno che non si usi un'altra libreria di simulazione, che utilizza un profiler.

Tale libreria è JustMock by Telerik.

+0

Ok ... quindi come mi aiuta a risolvere il problema con RhinoMock? –

+2

Non funziona :) Mi dispiace non è possibile con RhinoMock. RhinoMock intercetta le chiamate ai metodi ereditandole da un oggetto e sovrascrivendole (è per questo che devono essere virtuali). Non è possibile sovrascrivere un metodo statico (di estensione) ed è questo il motivo per cui Rhino fallisce in questa situazione. – Slavo

+0

Quindi TypeMock può, sì? – abatishchev

0

È possibile stub metodo di estensione o qualsiasi altro metodo statico senza alcuna struttura. Il seguente codice ti consente di farlo, devi solo eseguire lo stub _doSumm.

public static class MyExtensions 
{ 
    public static Func<int,int, int> _doSumm = (x, y) => x + y; 

    public static int Summ(this int x, int y) 
    { 
     return _doSumm(x, y); 
    } 
} 
0

Nel mio caso, ho avvolto i metodi di estensione che ho dovuto stub sui metodi di una classe di supporto che hanno esposto i metodi di wrapper in una nuova interfaccia. Ho cambiato il mio codice di produzione per fare in modo che un'istanza di questa classe helper fosse iniettata e modificato il codice per chiamare i nuovi metodi. I test unitari stanno iniettando uno stub opportunamente predisposto dell'interfaccia helper.

Mentre questa soluzione non è perfetta, è ancora meno drammatica rispetto allo scambio della struttura di derisione.