Шим-метод пустоты

У меня есть следующие (устаревшие, унаследованные от предшественников) классы и методы 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

Я пытаюсь проверить это в проекте Unit Test С# (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 вызывает ожидаемое исключение. Однако я не хочу, чтобы журнал событий записывался. Итак, как мне настроить MyUtitlityClass, чтобы перехватить вызов LogError и ничего не делать вместо этого?

Все примеры подделок, которые я видел, относятся к методам, которые возвращают поддельное значение (и все написаны на C#!) Когда я пытаюсь реализовать такой шаблон, он выдает ошибку, что LogError не имеет добытчик.


person Shevek    schedule 24.07.2013    source источник
comment
извините за комментарии C # в коде VB.Net - средство визуализации обнаруживает комментарий VB.Net ' как ограничитель строки и неправильно форматирует   -  person Shevek    schedule 24.07.2013
comment
@Meta-Knight - спасибо, что показали мне, как получить комментарии VB!   -  person Shevek    schedule 24.07.2013


Ответы (2)


Я думаю, вы ищете что-то вроде:

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

Or, in C#:

using (context = ShimsContext.Create()) {
    ShimMyUtilityClass.LogStringStringException =
        (string aClass, string aMethod, Exception anException) => { 
            // YOUR CODE HERE
        };
}
person jessehouwing    schedule 24.07.2013
comment
Шикарно, работает блестяще. Чего мне не хватало, так это пустого { } - person Shevek; 24.07.2013
comment
Я добавил несколько поддельных строк кода в свой {} и во время отладки заметил, что вместо реального метода он попадает в мои поддельные строки кода в {}, и это то, что мне нужно... - person Ziggler; 22.05.2019

Сначала вам нужно создать поддельную сборку сборки, которая содержит MyUtilityClass. Затем, используя оболочку экземпляра класса MyUtility, имитируйте метод LogError. Следующее может помочь:

        using (ShimsContext.Create())
        {   
            ShimMyUtilityClass temp = new ShimMyUtilityClass();
            temp.LogStringStringException = ....
            this.myClass.MyMethod("0,");
        }
person daryal    schedule 24.07.2013
comment
LogStringStringException не отображается на объекте temp - person Shevek; 24.07.2013
comment
Этот метод является статическим, поэтому вам нужно установить его для всей оболочки, а не для экземпляра оболочки. - person jessehouwing; 25.07.2013