【发布时间】:2017-04-04 09:09:56
【问题描述】:
我正在尝试编写一个测试来验证子类是否调用特定基类的构造函数。实际上,我的实体的 ID 是在服务器实例化对象时生成的。我使用 NHibernate 作为我的 ORM,所以我需要一个 0 参数的构造函数。我希望这个构造函数不会在每次 NHibernate 水合实体时生成 Guid,所以我为我的基本实体创建了第二个构造函数,并以 Guid 作为参数。
看起来像这样
public abstract class EntityBase {
public Guid ID {get; protected set;}
protected EntityBase() { }
public EntityBase(Guid id) { ID = id }
public static Guid NewID => GenerateGuid();
}
public class Entity : EntityBase {
public int X {get; set;}
protected Entity() { }
public Entity(int x) : base(NewID) { X = x; }
}
我要编写的这个测试应该断言 EntityBase 的所有具体子类的所有构造函数(除了 0 参数构造函数)调用正确的基构造函数:
public EntityBase(Guid id) { ID = id }
目前,我的代码循环遍历所有可从 EntityBase 分配的具体类的构造函数,但我不知道如何进行最终检查。对解决方案的研究建议尝试使用反射来读取 IL。我考虑过尝试检查是否调用了“NewID”,但也找不到任何完成该操作的方法。
有没有办法实现这一点,或者我对 NHibernate 问题的解决方案是真正的问题?
【问题讨论】:
-
派生类实例化后能否更改ID?如果没有,为什么不将其更改为私有集,然后检查它是否已设置?还是您的问题比这更复杂?嗯,我猜这是单元测试,有人可以轻松地将“受保护”更改为“公共”......
-
不,实例化后无法更改。我想编写一个单元测试来强制执行正确的构造函数行为。如果我尝试调用每个构造函数并检查是否设置了 ID 字段,那么我需要找到某种方法来为每个可能的当前和未来构造函数实例化一组未知的参数。此外,如果子类的构造函数使用其参数的属性,那么我需要确保这些字段也被填充。
标签: c# nhibernate reflection constructor