我们的团队刚刚开始单元测试和模拟,我们已经就扩展方法进行了一些讨论。问题是什么是测试使用扩展方法的类的好方法。 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/