gpt4 book ai didi

c# - 单元测试扩展方法

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

我们的团队刚刚开始单元测试和模拟,我们已经就扩展方法进行了一些讨论。问题是什么是测试使用扩展方法的类的好方法。 IE。我们有一个像这样的枚举..

public enum State
{
[LangID(2817)]
Draft = 0,
[LangID(2832)]
Booked = 1,
[LangID(1957)]
Overdue = 2,
[LangID(2834)]
Checked = 3,
}

其中使用了扩展方法:

public static string GetDescription(this Enum _enum)
{
Type type = _enum.GetType();
MemberInfo[] memInfo = type.GetMember(_enum.ToString());
if (memInfo != null && memInfo.Length > 0)
{
object[] attrs = memInfo[0].GetCustomAttributes(typeof(LangID), false);
if (attrs != null && attrs.Length > 0)
return LanguageDB.GetString(((LangID)attrs[0]).ID);
}
return _enum.ToString();
}

这将再次被被测类调用,就像这样..

public class SUT(){

public void MethodUnderTest(){
string description = SomeObject.Status.GetDescription();//Status is Type State
}
}

在此示例中,枚举通过 LanguageDB 获取用户语言的描述,不幸的是,由于它是静态的,因此未注入(inject)到类中。我们自然可以折射很多,但考虑到代码几乎完美无缺,这将是一项巨大的投资。有什么好的建议吗?

最佳答案

如果您正在使用 MS 的测试套件,您可以进行非常简单的重构,并能够使用访问器将模拟注入(inject)到您的静态类型对象中。

假设您有这样的代码:

public static void Save(this Entity data)
{
Repository.Instance.Save(data);
}

静态中的静态...难以测试?并不真地。修改扩展类:

private static Repository Instance
{
get
{
return _repository ?? Repository.Instance;
}
}
private static Repository _repository = null;

public static void Save(this Entity data)
{
Instance.Save(data);
}

简单重构。现在,您可以使用访问器在测试时设置模拟...

[TestInitialize(), DebuggerStepThrough]
public void Setup()
{
MyEntityExtensions_Accessor._repository = new Mock<IRepository>();
}

关于c# - 单元测试扩展方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1271684/

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