gpt4 book ai didi

c# - 如何 stub 静态方法?

转载 作者:太空狗 更新时间:2023-10-30 00:56:32 25 4
gpt4 key购买 nike

我正在开发一个棕地应用程序,目前正在重构其中的一部分。我正在尝试以 TDD 方式执行此操作,但遇到了问题。我正在测试的部分代码确实如此

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

其中 GetEnabledLanguages 具有以下签名

public static List<LanguageBranch> GetEnabledSiteLanguages();

它依次调用数据访问代码来检索相关信息。到目前为止,我已经使用接口(interface)和 DI 在单元测试期间对这些类型的依赖项使用不同的 stub 实现。但是由于 GetEnabledSiteLanguages 方法是静态的,所以这将不起作用。在这种情况下,“正确”的做法是什么?

最佳答案

您可以创建一个实现接口(interface)的对象,并将其实现注入(inject)到使用 SiteSettings 类的类中。该接口(interface)使用与您需要拦截的静态方法相同的签名声明方法。然后你可以模拟测试接口(interface)并创建一个单一的实现,它委托(delegate)给实际代码的静态方法:

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;
}
}

关于c# - 如何 stub 静态方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7471103/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com