从VSTS自动生成的上面访问器代码来看,已经有私有字段及方法的封装,实际在单元测试中的访问器能见到受测类的私有方法及字段(智能感知出得来),如基类的_ctlBillErrorTips,然而单元测试方法访问到_accessor._ctlBillErrorTips会报如下错误:System.MissingFieldException: System.MissingFieldException: 未找到字段“XXXX.XXXXX.Layout.OutBillDetailViewPresenter._ctlBillErrorTips”。
问题在于测试初始化代码(一般基类没有泛型的情况下这样没有问题)如下:
_privateObject = new PrivateObject(_target);
_accessor = new BillDetailBaseViewPresenter_Accessor<IOutBillRepository, IOutBill, IOutBillItem, OutBillStatus>(_privateObject);
解决该问题的方法是把new PrivateObject改为如下:
_privateObject = new PrivateObject(_target, new PrivateType(_target.GetType().BaseType));
_accessor = new BillDetailBaseViewPresenter_Accessor<IOutBillRepository, IOutBill, IOutBillItem, OutBillStatus>(_privateObject);
换句话说,创建的PivateObject实例是基于父类的就OK了。
错误描述有段清楚的描述不可忽略:
System.ArgumentException:
未能找到指定的成员(XXXXXX)。可能需要重新生成专用访问器,或者该成员可能是私有成员并且是在基类上定义的。如果属于后一种情况,则需要将用来定义成员的类型传递到 PrivateObject 的构造函数中。