BBo*_*org 4 c# extension-methods unit-testing
我们的团队刚刚开始进行单元测试和模拟,我们在考虑扩展方法时遇到了一些讨论.问题是什么是测试类的好方法,它使用扩展方法.即我们有这样的Enum ..
public enum State
{
[LangID(2817)]
Draft = 0,
[LangID(2832)]
Booked = 1,
[LangID(1957)]
Overdue = 2,
[LangID(2834)]
Checked = 3,
}
Run Code Online (Sandbox Code Playgroud)
其中使用了扩展方法:
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();
}
Run Code Online (Sandbox Code Playgroud)
这将再次由被测试的类调用,如此...
public class SUT(){
public void MethodUnderTest(){
string description = SomeObject.Status.GetDescription();//Status is Type State
}
}
Run Code Online (Sandbox Code Playgroud)
在这个例子中,enum通过LanguageDB获取用户语言的描述,遗憾的是,它不是在类中注入的,因为它是静态的.我们可以自然地折射这一批,但考虑到代码几乎完美无缺,这将是一笔巨大的投资.有什么好建议吗?
小智 7
如果您正在使用MS'测试套件,则可以进行非常简单的重构,并且能够使用Accessors将模拟注入静态类型对象.
假设你有这样的代码:
public static void Save(this Entity data)
{
Repository.Instance.Save(data);
}
Run Code Online (Sandbox Code Playgroud)
一个静态的静态......难以测试?并不是的.这样修改扩展类:
private static Repository Instance
{
get
{
return _repository ?? Repository.Instance;
}
}
private static Repository _repository = null;
public static void Save(this Entity data)
{
Instance.Save(data);
}
Run Code Online (Sandbox Code Playgroud)
简单的重构.现在,您可以使用访问器在测试时设置模拟...
[TestInitialize(), DebuggerStepThrough]
public void Setup()
{
MyEntityExtensions_Accessor._repository = new Mock<IRepository>();
}
Run Code Online (Sandbox Code Playgroud)
几乎完美无瑕?;-)
规则1:如果无法测试,请不要写.
规则2:很多事情都是生活看似tehy会伤害,但不是.
你有多确定这次重构将是一笔巨大的投资?
规则0:规则是为了智者的指导和白痴的服从.
这是判断,你有多大可能通过工作避免该方法的缺陷?我的猜测是,在这种情况下,重构该方法的好处非常小.