5

次の(レガシー、前任者から継承)VB.Net(フレームワーク2.0)のクラスとメソッドがあり、例外でシステムイベントログを作成します。

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では、呼び出しを傍受して代わりに何もしないように Shim するにはどうすればよいでしょうか。LogError

私が見た Fakes の例はすべて、偽の値を返すメソッドに関するものです (そして、すべてC# で記述されています!) そのようなパターンを実装しようとすると、LogError に getter がないというエラーが発生します。

4

2 に答える 2

5

次のようなものを探していると思います。

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

または、C# の場合:

using (context = ShimsContext.Create()) {
    ShimMyUtilityClass.LogStringStringException =
        (string aClass, string aMethod, Exception anException) => { 
            // YOUR CODE HERE
        };
}
于 2013-07-24T14:58:58.637 に答える
0

まず、 を含むアセンブリのフェイク アセンブリを作成する必要がありますMyUtilityClass。次に、MyUtilityクラスの shimmed インスタンスを使用して、LogError メソッドをモックします。以下が役立つ場合があります。

        using (ShimsContext.Create())
        {   
            ShimMyUtilityClass temp = new ShimMyUtilityClass();
            temp.LogStringStringException = ....
            this.myClass.MyMethod("0,");
        }
于 2013-07-24T15:01:03.633 に答える