单元测试扩展方法

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)


djn*_*jna 5

几乎完美无瑕?;-)

规则1:如果无法测试,请不要写.

规则2:很多事情都是生活看似tehy会伤害,但不是.

你有多确定这次重构将是一笔巨大的投资?

规则0:规则是为了智者的指导和白痴的服从.

这是判断,你有多大可能通过工作避免该方法的缺陷?我的猜测是,在这种情况下,重构该方法的好处非常小.