2013-07-24 19 views
5

Mam następujący (Legacy, odziedziczony poprzedników) VB.Net (Framework 2.0) Klasy i metody, która tworzy zdarzenie systemowe Zaloguj się wyjątek:Shim pustka metoda

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 

próbuję przetestować w projekcie testowym C# (framework 4.5) Unit i część logiki wymaga, aby aValue były dwoma liczbami oddzielonymi przecinkiem - w ten sposób zgłaszając wyjątek i dziennik zdarzeń, jeśli nie.

mam założyć następujące testów jednostkowych w celu zapewnienia, że ​​wyjątek jest poprawnie wrzucony:

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

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

To wszystko działa ładnie i testy przechodzi, jak logika w MyMethod powoduje oczekiwany wyjątek. Nie chcę jednak, aby rejestr zdarzeń był zapisywany. Jak więc Shim the MyUtitlityClass przechwycić połączenie do LogErrori nic nie robić zamiast tego?

Wszystkie przykłady podróbki widziałem są dla metod zwracających fałszywą wartość (i są wszystko napisany w języku C#!) Kiedy próbuję i wdrożenie takiego wzoru, daje błąd, który logError nie posiada rębacz.

+0

przykro C# komentarzach w kodzie VB.Net - renderer wykrywa komentarz VB.Net ' '' jako terminator smyczkowy i formatów nieprawidłowo – Shevek

+1

@ Meta-rycerz - dzięki za pokazując mi, jak uzyskać komentarze VB! – Shevek

Odpowiedz

4

myślę szukasz czegoś wzdłuż linii:

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

lub w C#:

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

Fantastyczny, działa znakomicie. Bit, którego mi brakowało, to pusty '{}' – Shevek

0

Najpierw trzeba stworzyć zespół podróbki zespołu, który zawiera MyUtilityClass . Następnie przy użyciu rzuconej instancji klasy MyUtility kpisz z metody LogError. Mogą pomóc:

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

'LogStringStringException' nie pojawia się w obiekcie' temp' – Shevek

+0

Metoda jest statyczna, dlatego musisz ustawić ją na całej Shim, a nie na instancji Shima. – jessehouwing

Powiązane problemy