2013-07-24 5 views
5

シムvoidメソッド

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 

私はこれをテストしようとしていますC#(フレームワーク4.5)単体テストプロジェクトでは、aValueはコンマで区切られた2つの数字でなければなりません。そうしないと、例外とイベントログがスローされます。

私は例外が正しくスローされることを保証するために、次のユニットテストを設定している:

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

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

は、このすべてがうまく動作してMyMethodでロジックが予想される例外が発生するような試験は、合格します。しかし、私はイベントログを書きたくはありません。だから、MyUtitlityClassをシムしてLogErrorへのコールを傍受し、代わりに何もしないのですか?

私が見てきたすべての偽物の例は、偽の値を返すメソッドのためのもの(およびC#で書かれたすべてのです!)私がしようとすると、このようなパターンを実装する場合、それはのlogErrorが持っていないというエラーを出しますゲッター

+0

- レンダラは、文字列の終端およびフォーマットとして ' '' VB.Netのコメントを検出し、誤っ – Shevek

+1

メタナイト@ - の感謝を私のVBのコメントを取得する方法を教えて! – Shevek

答えて

4

私はあなたの線に沿って何かを探していると思う:

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

または、C#で:

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

素晴らしいです。すごくうまくいきます。私が見逃していたビットは空の '{}'だった – Shevek

0

まずあなたがMyUtilityClassを含むアセンブリの偽物アセンブリを作成する必要があります。 MyUtilityクラスのshimmedインスタンスを使用して、LogErrorメソッドをモックします。 以下が役立つことがあります。

VB.NetコードでC#のコメントについては申し訳ありません
 using (ShimsContext.Create()) 
     { 
      ShimMyUtilityClass temp = new ShimMyUtilityClass(); 
      temp.LogStringStringException = .... 
      this.myClass.MyMethod("0,"); 
     } 
+0

'LogStringStringException'は' temp'オブジェクトには表示されません – Shevek

+0

メソッドは静的ですから、インスタンス上ではなくShim全体に設定する必要がありますシムの – jessehouwing

関連する問題