【问题标题】:Testing the typesafe enum pattern in C#在 C# 中测试类型安全枚举模式
【发布时间】:2013-07-09 12:56:32
【问题描述】:

我正在使用“类型安全枚举模式”

public class Level
{
    public static readonly Level Low = new Level(0, "Low");
    public static readonly Level Medium = new Level(1, "Medium");
    public static readonly Level High = new Level(2, "High");

    private int _value;
    private string name;

    private Level(int value, string name)
    {
        _value=value;
        _name=name;
    }
}

为了测试目的,我需要创建一个无效的关卡,我用反射来做。

int id = -1;
string value = "invalid";
var constructor = typeof(Level).GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] {typeof(int), typeof(string)}, null);
var invalidLevel = (Level)constructor.Invoke(new object[] {id, value});

使用反射访问私有构造函数似乎....对我来说是错误的。有没有更好的方法来制作无效的关卡?

【问题讨论】:

  • 我真的不明白您为什么要使用反射验证无效的Level?这对我来说似乎太过分了。如果你完全控制了这个库(即它没有在其他地方使用),这将永远不会发生,除非你自己做。如果没有,您的库的用户知道使用私有构造函数创建对象超出了您的库的范围

标签: c# unit-testing design-patterns testing nunit


【解决方案1】:

出于测试目的,我需要创建一个无效的关卡

为什么?此处枚举模式的重点是停止那里永远不会成为无效级别。

试图测试这个被破坏就像试图通过使用错误数量的参数通过反射调用一个方法来测试它是否是类型安全的。基本上,您不应该尝试测试这条路径 IMO。

您可能确实想要测试接收Level的任何代码的一条路径是它是否适当地处理空值(例如,通过抛出ArgumentNullException)。

【讨论】:

  • 不幸的是,有一个模型使用Level作为字段。该模型以我无法控制的方式从数据库映射。它刚刚发生在映射创建的地方......一个空值。是的,你成功了。和鸭子说话。谢谢!
【解决方案2】:

单元测试是关于测试类的公共方法/属性(即行使公共 API)。只要您的班级不公开公共 ctor,您就不需要对此进行测试。

【讨论】:

  • 你可能还想写一两个测试。比想知道为什么没有设置属性或其他一些愚蠢的错误更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-02
相关资源
最近更新 更多