c# - 单元测试扩展方法

标签 c# unit-testing extension-methods

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

相关文章:

c# - 在 C# 中向 RichTextBox 添加字符串

c# - 在 C# Windows 窗体中使用文本搜索过滤组合框项目

c# - 将 ProcessStartInfo.WorkingDirectory 设置为 UNC 路径

unit-testing - 根据代码记录单元测试

c# - 一般编写扩展的正确方法是什么?

entity-framework - 使用Moq和Autofac在单元测试中 Entity Framework 的扩展方法

c# - 使用 Revit API 在模型中放置自定义体量族实例

unit-testing - typescript 中的Sinon stub 私有(private)变量?

python - 让 Nose 无法通过慢速测试

c# - 如何为泛型类编写 C# 扩展方法