È possibile simulare un metodo statico usando Rhino.Mocks? Se Rhino non supporta questo, esiste un pattern o qualcosa che mi consenta di ottenere lo stesso risultato?Mocking Metodi statici che usano Rhino.Mocks
risposta
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.
Completa la chiamata al metodo statico in un metodo di istanza virtuale in un'altra classe, quindi prendi in giro.
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.
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.
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.
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.
Penso che sia la classe proxy TypeToTest che questa interfaccia ITypeToTest debbano essere pubbliche per Rhino Mocks –
soluzione migliore per me, ma prima o poi il codice diventa potenziato per questo aspetto. –