Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 如何使用FakeiTasy伪造嵌套属性?_Unit Testing_Fakeiteasy - Fatal编程技术网

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

那我就可以假装了

正如文件中所述:

一旦构造了伪对象,其方法和属性可以被覆盖,如果它们是:

  • 虚拟的
  • 抽象的,或
  • 当接口被伪造时的接口方法
我找到了解决办法

我需要将ModuleBase类中的所有嵌套属性更改为Interface或将它们标记为virtual

那我就可以假装了

正如文件中所述:

一旦构造了伪对象,其方法和属性可以被覆盖,如果它们是:

  • 虚拟的
  • 抽象的,或
  • 当接口被伪造时的接口方法