如何存根一个静态方法

本文关键字:静态方法 一个 存根 何存根 | 更新日期: 2023-09-27 18:09:05

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

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

其中GetEnabledLanguages具有以下签名

public static List<LanguageBranch> GetEnabledSiteLanguages();

依次调用数据访问代码检索相关信息。到目前为止,我一直使用接口和DI来为单元测试期间的这些依赖使用不同的存根实现。但是由于GetEnabledSiteLanguages方法是静态的,这将不起作用。在这种情况下,"正确"的做法是什么?

如何存根一个静态方法

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

让你的方法如下:

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

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

Moles框架

您可以使用JustMock, TypeMock或mole等工具。这些工具允许您模拟像静态方法一样的一切。