填充空白方法

本文关键字:方法 填充空白 | 更新日期: 2023-09-27 18:24:55

我有以下(遗留的,从前辈继承的)VB.Net(framework 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#(framework 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中的逻辑导致了预期的异常。但是,我不希望编写事件日志。那么,我如何Shim MyUtitlityClass来拦截对LogError的调用,而不执行任何操作呢

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

填充空白方法

我认为您正在寻找以下内容:

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
        };
}

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

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