2013-07-24 11 views
5

Ho il seguente (eredità, ereditata dai predecessori) VB.Net (quadro 2.0) classi e metodi che crea un registro eventi di sistema sul Eccezione:Shim Un vuoto metodo

Public Interface IMyClass 

    Function MyMethod(ByVal aValue As String) As Date 

End Interface 

Public Class MyClass 

    Implements IMyClass 

    Public Function MyMethod(ByVal aValue As String) As Date Implements IMyClass.MyMethod 

     Try 

      ' Calculate return date based on aValue 

     Catch ex As Exception 
      Call MyUtilityClass.LogError("MyClass", "MyMethod", ex) 
      Throw 
     End Try 

    End Function 

End Class 

Partial Public NotInheritable Class MyUtilityClass 

    Public Shared Sub LogError(ByVal className As String, 
           ByVal methodName As String, 
           ByVal ex As Exception) 

     ' Write details to Event Log 
    End Sub 

End Class 

sto cercando di testare questo in un progetto C# Unit (framework 4.5) Test unità e parte della logica richiede che aValue siano due numeri separati da una virgola, in tal modo generando un'eccezione e un registro eventi se non.

ho predisposto il seguente unit test per garantire che l'eccezione sia correttamente gettato:

[TestClass] 
public class MyClassUnitTest 
{ 
    private readonly StubMyClass myClass = new StubMyClass(); 

    [TestMethod] 
    [ExpectedException(typeof(InvalidCastException))] 
    public void TestMyMethodInvalidMissingNumber() 
    { 
     this.myClass.MyMethod("0,"); 
    } 
} 

Questo tutto funziona bene e il test viene superato, come la logica MyMethod causa l'eccezione prevista. Tuttavia, non voglio che il registro eventi venga scritto. Quindi, come faccio a Shim the MyUtitlityClass per intercettare la chiamata a LogErrore non fare nulla invece?

Tutti gli esempi Falsi che ho visto sono per i metodi che restituiscono un valore falso (e sono tutto scritto in C#!) Quando provo e attuare un tale modello, dà un errore che LogError non dispone di un getter.

+0

dispiace per C# commenti nel codice VB.Net - il renderer rileva il commento VB.Net ' '' come terminatore di stringa e formati in modo non corretto – Shevek

+1

@ Meta-Knight - grazie per la mostrandomi come ottenere i commenti VB in! – Shevek

risposta

4

Penso che tu sia alla ricerca di qualcosa sulla falsariga di:

Using context = ShimsContext.Create() 
    ShimMyUtilityClass.LogStringStringException = 
     Sub(aClass As String, aMethod As String, anException As Exception) 
     End Sub 
End Using 

Or, in C#:

using (context = ShimsContext.Create()) { 
    ShimMyUtilityClass.LogStringStringException = 
     (string aClass, string aMethod, Exception anException) => { }; 
} 
+0

Fantastico, funziona brillantemente. Il bit che mi mancava era il '{}' vuoto – Shevek

0

In primo luogo è necessario creare un assembly falsi del gruppo che contiene MyUtilityClass . Quindi si utilizza l'istanza con spaziatura della classe MyUtility per il metodo LogError. Possono aiutare:

 using (ShimsContext.Create()) 
     { 
      ShimMyUtilityClass temp = new ShimMyUtilityClass(); 
      temp.LogStringStringException = .... 
      this.myClass.MyMethod("0,"); 
     } 
+0

'LogStringStringException' non appare sull'oggetto' temp' – Shevek

+0

Il metodo è statico, motivo per cui è necessario impostarlo sull'intero Shim, non su un'istanza di uno spessore. – jessehouwing

Problemi correlati