Модульное тестирование HtmlHelper, которому необходим доступ к уровню данных - PullRequest
1 голос
/ 29 октября 2009

Я пытаюсь создать модульный тест для HtmlHelper, который обращается к моему слою данных, чтобы получить строку. Я просмотрел множество сообщений об этом, и я, вероятно, что-то упустил. Проблема, с которой я сталкиваюсь, заключается в том, как мне издеваться над доступом к слою данных? Я обычно делаю инъекцию зависимостей через конструктор, но я не могу здесь, потому что помощник html должен быть статическим. Итак, я настроил инъекцию через свойство, но как мне получить к нему доступ из моего модульного теста. Извините, если это очевидно, но это меня сейчас портит.

Вот что у меня есть -

public static class StringResourceHelper
{

    #region Private Members

    private static IStringResourceService _service;

    #endregion

    #region Public Properties

    private static IStringResourceService Service
    {
        get
        {
            if(_service==null)
            {
                _service = (IStringResourceService)Bootstrapper.Container.Resolve(typeof(IStringResourceService));
            }

            return _service;
        }
    }

    #endregion

    #region Public Methods

    public static string StringResource(this HtmlHelper helper, string label)
    {
        int languageCode;

        if(helper.ViewData["LanguageCode"] == null || !Int32.TryParse(helper.ViewData["LanguageCode"].ToString(), out languageCode))
        {
            languageCode = Constants.LanguageCodes.English;
        }

        return Service.GetString(label, languageCode);
    }

    #endregion

}

Как мне посмеяться над вызовом Service.GetString?

Ответы [ 2 ]

1 голос
/ 06 ноября 2009

Отказ от ответственности Я работаю в Typemock

Если вам нужно смоделировать / подделать статические методы и без изменения кода, вам нужно использовать Изолятор . Подделка метода осуществляется с помощью:

Isolate.WhenCalled(() => Service.GetString(string.empty, 0)).WillReturn(/*insert return value here*/);

Если вы хотите проверить аргументы, переданные в Service.GetString, используйте следующее:

Isolate.Verify.WasCalledWithExactArguments(() => Service.GetString(/* use expected arguments*/);
0 голосов
/ 29 октября 2009

Для начала я бы устал от любых статических методов, которые требуют переменную-член. Для меня это признак того, что у вас есть объект (вероятно, в одной области). Поэтому мое первое предложение состояло бы в том, чтобы перевести StringResourceHelper в нестатический класс и использовать DI как обычно.

Если вы не можете, то поддерживает ли ваш DI-фреймворк статическую установку сеттера? Предупреждающие сигналы звучат для меня, если я вижу что-то за пределами начальной загрузки, играющее с платформой DI, как мне кажется, что вы используете платформу DI в качестве локатора службы.

Если вы не можете изменить класс на нестатический, и ваша структура DI не поддерживает статический ввод метода установки, тогда я бы либо:

Установите DI-фреймворк как часть тестов, настроенных на возврат макетов или добавьте сеттер в StringResourceHelper, чтобы им можно было управлять.

...