我正在开发一个棕色地块应用程序,目前正在重构其中的一部分。我试图以TDD方式做到这一点,但遇到了问题。我正在测试的部分代码
var siteLanguages = from sl in SiteSettings.GetEnabledSiteLanguages() select sl.LanguageID;
其中GetEnabledLanguages
具有以下签名
public static List<LanguageBranch> GetEnabledSiteLanguages();
它轮流调用数据访问代码来检索相关信息。直到现在我还使用了一个接口和DI在单元测试期间为这些依赖项使用不同的存根实现。但由于GetEnabledSiteLanguages
方法是静态的,因此不起作用。在这种情况下,做到这一点的“正确”方法是什么?
答案 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)
答案 3 :(得分:0)
查看Moles
框架。