Shim a void方法

时间:2013-07-24 14:18:53

标签: c# vb.net void microsoft-fakes shim

我有以下(遗留,继承自前辈)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是由逗号分隔的两个数字 - 从而抛出异常和事件日志(如果没有)。

我已设置以下单元测试以确保正确抛出异常:

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

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

这一切都运行良好,测试通过,因为MyMethod中的逻辑导致了预期的异常。但是,我不希望写入事件日志。那么,我如何重新调整MyUtitlityClass来拦截对LogError 的调用而不执行任何操作?

我看到的所有Fakes示例都是针对返回伪值的方法(并且所有都是用C#编写的!)当我尝试实现这样的模式时,它会给出一个LogError错误的错误没有吸气剂。

2 个答案:

答案 0 :(得分: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
        };
}

答案 1 :(得分:0)

首先,您需要创建包含MyUtilityClass的程序集的fakes程序集。  然后使用MyUtility类的shimmed实例模拟LogError方法。 以下内容可能有所帮助:

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