如何存根静态方法?

时间:2011-09-19 12:42:42

标签: c# tdd stub

我正在开发一个棕色地块应用程序,目前正在重构其中的一部分。我试图以TDD方式做到这一点,但遇到了问题。我正在测试的部分代码

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

其中GetEnabledLanguages具有以下签名

public static List<LanguageBranch> GetEnabledSiteLanguages();

它轮流调用数据访问代码来检索相关信息。直到现在我还使用了一个接口和DI在单元测试期间为这些依赖项使用不同的存根实现。但由于GetEnabledSiteLanguages方法是静态的,因此不起作用。在这种情况下,做到这一点的“正确”方法是什么?

4 个答案:

答案 0 :(得分:4)

你可以创建一个实现接口的对象,并将其实现注入到使用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;
    }
}

答案 1 :(得分:2)

如何制作方法如下:

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

现在它成为第一类对象(作为Func委托),存根可以替换它

答案 2 :(得分:0)

您可以使用JustMockTypeMockmoles等工具。这些工具允许您模拟静态方法等所有方法。

答案 3 :(得分:0)

查看Moles框架。