Unit testing 如何使用FakeiTasy伪造嵌套属性?
我的课程如下:Unit testing 如何使用FakeiTasy伪造嵌套属性?,unit-testing,fakeiteasy,Unit Testing,Fakeiteasy,我的课程如下: 公共类节点操作符 { 私有节点信息(NodeInfo),; 公共节点操作员(NodeInfo NodeInfo) { _nodeInfo=nodeInfo; } 公共bool DoSomething(int-dstRackId、int-srcRackId、ModuleBase-srcModulebase) { if(dstRackId==srcRackId) { if(srcModulebase.FieldBus.HardwareConfiguration.DdfInfo.Use
公共类节点操作符
{
私有节点信息(NodeInfo),;
公共节点操作员(NodeInfo NodeInfo)
{
_nodeInfo=nodeInfo;
}
公共bool DoSomething(int-dstRackId、int-srcRackId、ModuleBase-srcModulebase)
{
if(dstRackId==srcRackId)
{
if(srcModulebase.FieldBus.HardwareConfiguration.DdfInfo.UserDefine.InstallRestrictions.Position==ModulePosition.Right)
返回true;
其他的
返回false;
}
其他的
return _nodeInfo.CanAppendModule(dstRackId,srcModulebase,AppendDirection.Right);
}
}
我想对DoSomething方法进行单元测试,因此我编写了以下代码:
public void DoSomethingTest()
{
var nodeInfo=A.Fake();
var srcModulebase=A.Fake();
A.CallTo(()=>srcModulebase.FieldBus.HardwareConfiguration.DdfInfo.UserDefine.InstallRestrictions.Position)。返回(ModulePosition.Right);//抛出System.Reflection.TargetException:
var nodeOperator=新的nodeOperator(nodeInfo);
int-dstRackId=0;
int srcRackId=0;
AreEqual(true,nodeOperator.DoSomething(dstRackId,srcRackId,srcModulebase));
A.CallTo(()=>nodeInfo.CanAppendModule(dstRackId,srcModulebase,AppendDirection.Right)).mustNothaveOccessed();
}
在这个函数(DoSomething)中,我不关心moduleBase实例是否正确。此外,我不在乎moduleBase中的属性是否已初始化
所以我写了下面的代码来伪造财产
A.CallTo(()=>srcModulebase.FieldBus.HardwareConfiguration.DdfInfo.UserDefine.InstallRestrictions.Position)。返回(ModulePosition.Right);
但这会引起反射。TargetException:“非静态方法需要目标”。
srcModulebase的现场总线属性为空
我怎么能忽略假类内部的初始化,而只伪造我想要的嵌套属性呢
我知道在这种情况下,我可以只传递ModulePosition而不是ModuleBase,但我只想知道如何伪造这种嵌套属性。我找到了解决方案
我需要将ModuleBase类中的所有嵌套属性更改为Interface或将它们标记为virtual
那我就可以假装了
正如文件中所述:
一旦构造了伪对象,其方法和属性可以被覆盖,如果它们是:
- 虚拟的
- 抽象的,或
- 当接口被伪造时的接口方法
- 虚拟的
- 抽象的,或
- 当接口被伪造时的接口方法