2009-02-12 15 views

risposta

70

E 'possibile deridere un metodo statico utilizzando Rhino.Mocks

No, non è possibile.

TypeMock può eseguire questa operazione perché utilizza il profiler CLR per intercettare e reindirizzare le chiamate.

RhinoMocks, NMock e Moq non possono farlo perché queste librerie sono più semplici; non usano le API del profiler CLR. Sono più semplici in quanto utilizzano i proxy per intercettare i membri virtuali e le chiamate di interfaccia. Lo svantaggio di questa semplicità è che non possono deridere certe cose, come metodi statici, proprietà statiche, classi sigillate o metodi di istanza non virtuali.

21

Completa la chiamata al metodo statico in un metodo di istanza virtuale in un'altra classe, quindi prendi in giro.

+1

soluzione migliore per me, ma prima o poi il codice diventa potenziato per questo aspetto. –

4

L'unico sistema fittizio che io conosca che supporti la statica di derisione è TypeMock.

Come suggerito da Rytmis, è necessario avvolgere le statiche in qualcosa (vale a dire una classe di istanza con metodi virtuali o un'interfaccia) che è quindi possibile prendere in giro.

2

Mi sono burlato usando moq, non penso che possiamo deridere membri statici usando questo perché moQ crea un nuovo proxy per il target (classe o interfaccia). Quindi, solo i membri ereditabili (virtuale in caso di classe, pubblico in termini di interfaccia) possono essere derisi. Chiaramente, i membri statici non sono ereditati, quindi il problema.

4

Questo è il più grande svantaggio di Rhino Mocks. Non so se sia possibile per Rhino Mocks implementarlo senza una ri-concezione di come si burla.

15

Se non è possibile utilizzare TypeMock per intercettare la chiamata al metodo, lo schema consigliato da utilizzare è creare un proxy che inoltra ai metodi non virtuali o statici che si desidera testare, quindi impostare l'attesa sul proxy . Per illustrare, considera le seguenti classi.

class TypeToTest 
{ 
    public void Method() { } 
} 

interface ITypeToTest 
{ 
    void Method(); 
} 

class TypeToTestProxy : ITypeToTest 
{ 
    TypeToTest m_type = new TypeToTest(); 

    public void Method() { m_type.Method(); } 
} 

Con la creazione di questo proxy, è ora possibile utilizzare un ITypeToTest al posto di dove si passavano o l'impostazione di un'istanza TypeToTest, facendo in modo che l'implementazione di default utilizza il TypeToTestProxy come si inoltra per l'effettiva attuazione. Quindi, puoi creare un simulato ITypeToTest nel codice di prova e impostare le aspettative di conseguenza.

Si noti che la creazione di questi proxy può essere molto noiosa, soggetta a errori e dispendiosa in termini di tempo. Per risolvere questo problema, gestisco una libreria e un set di strumenti che generano per voi gli assembly che contengono questi tipi. Si prega di fare riferimento a this page per ulteriori informazioni.

+0

Penso che sia la classe proxy TypeToTest che questa interfaccia ITypeToTest debbano essere pubbliche per Rhino Mocks –