Как заглушить статический метод? - PullRequest
3 голосов
/ 19 сентября 2011

Я работаю над приложением в коричневом поле и в настоящее время рефакторинг его части Я пытаюсь сделать это в стиле TDD, но сталкиваюсь с проблемой. Часть кода, который я тестирую, делает

var siteLanguages = from sl in SiteSettings.GetEnabledSiteLanguages() select sl.LanguageID;

где GetEnabledLanguages имеет следующую подпись

public static List<LanguageBranch> GetEnabledSiteLanguages();

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

Ответы [ 4 ]

4 голосов
/ 19 сентября 2011

Вы можете создать объект, который реализует интерфейс, и внедрить его реализацию в класс, который использует класс SiteSettings.Интерфейс объявляет метод с той же сигнатурой, что и статические методы, которые необходимо перехватить.Затем вы можете макетировать интерфейс для тестов и создать одну реализацию, которая делегирует статический метод для фактического кода:

public interface ISiteSettings
{
    public List<LanguageBranch> GetEnabledSiteLanguages()
}

public class ActualSiteSettings : ISiteSettings
{
    public List<LanguageBranch> GetEnabledSiteLanguages()
    {
         return SiteSettings.GetEnabledSiteLanguages();
    }
}

... в зависимом классе:

public class DependentClass
{
    private ISiteSettings m_siteSettings;

    public DependentClass(ISiteSettings siteSettings)
    {
    m_siteSettings=siteSettings;
    }

    public void SomeMethod
    {
         var siteLanguages = from sl in m_siteSettings.GetEnabledSiteLanguages() select sl.LanguageID;
    }
}
2 голосов
/ 19 сентября 2011

Как насчет создания вашего метода, такого как:

public static Func<List<LanguageBranch>> GetEnabledSiteLanguages = () => {
   //your code here
};

Теперь он становится объектом первого класса (как делегат Func) и заглушка может заменить его

0 голосов
/ 19 сентября 2011

Посмотрите на Moles рамки.

0 голосов
/ 19 сентября 2011

Вы можете использовать такие инструменты, как JustMock , TypeMock или кротов . Эти инструменты позволяют вам высмеивать все как статические методы.

...