Насмешливые запечатанные классы без публичных конструкторов? - PullRequest
6 голосов
/ 06 февраля 2012

Конкретный класс, который я тестирую, зависит от объекта HttpSessionState.

Класс HttpSessionState не имеет открытых конструкторов. Тестируемый класс использует этот объект только в качестве хранилища NameValue. Этот класс используется в веб-службе ASMX для возврата информации о конкретном методе.

Я думаю о создании фасада вокруг класса HttpSessionState, где я могу предоставить словарь вместо объекта Session при тестировании.

Это хорошая идея или стандартная практика?

Ответы [ 3 ]

8 голосов
/ 06 февраля 2012

Да, как гласит старая поговорка, нет ничего, что нельзя решить, добавив еще один уровень абстракции.Я обычно просто скрываю тип за интерфейсом, где методы интерфейса являются единственными, необходимыми для выполнения действий, которые я хочу над этим типом.

Просто смоделируйте интерфейс, который скрывает HttpSessionState, и выполняйте утверждения по использованиюинтерфейс, в Rhino Mocks это просто AssertWasCalled (d => ....) и т. д.

2 голосов
/ 06 февраля 2012

Вы можете издеваться над любым типом, даже запечатанным, используя Microsoft Moles Isolation Framework для .NET .Требуется немного усилий для настройки, но может быть лучше, чем добавить еще один уровень абстракции.Насмешка HttpContext и HttpSessionState с использованием родинок обсуждается здесь .Есть еще одно подобное обсуждение здесь .

2 голосов
/ 06 февраля 2012

Вы можете создать подкласс класса HttpSessionStateBase. Этот ответ показывает, как реализовать это для Moq, но вы все еще можете использовать класс MockHttpSession с вашими Rhino Mocks (я предполагаю. Я не использовал Rhino Mocks).

public class MockHttpSession : HttpSessionStateBase
{
    Dictionary<string, object> sessionStorage = new Dictionary<string, object>();

    public override object this[string name]
    {
        get { return sessionStorage[name]; }
        set { sessionStorage[name] = value; }
    }
}

Довольно обширное обсуждение о том, как издеваться над классами .NET, можно найти в блоге Скотта Хансельмана здесь .

...