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用逗号分隔的两个数字 - 如果不是,则抛出异常和事件日志。

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

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

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

这一切都很好,测试通过了,因为逻辑MyMethod导致了预期的异常。但是,我不希望写入事件日志。那么,我如何 ShimMyUtitlityClass来拦截呼叫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类的填充实例模拟 LogError 方法。以下可能会有所帮助:

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