У меня есть класс, как показано ниже:
public class NodeOperator
{
private NodeInfo _nodeInfo;
public NodeOperator(NodeInfo nodeInfo)
{
_nodeInfo = nodeInfo;
}
public bool DoSomething(int dstRackId, int srcRackId, ModuleBase srcModulebase)
{
if (dstRackId == srcRackId)
{
if (srcModulebase.FieldBus.HardwareConfiguration.DdfInfo.UserDefine.InstallRestrictions.Position == ModulePosition.Right)
return true;
else
return false;
}
else
return _nodeInfo.CanAppendModule(dstRackId, srcModulebase, AppendDirection.Right);
}
}
Я хочу провести модульный тест для метода DoSomething, поэтому я пишу некоторый код, как показано ниже:
public void DoSomethingTest()
{
var nodeInfo = A.Fake<NodeInfo>();
var srcModulebase = A.Fake<ModuleBase>();
A.CallTo(() => srcModulebase.FieldBus.HardwareConfiguration.DdfInfo.UserDefine.InstallRestrictions.Position).Returns(ModulePosition.Right); // throw System.Reflection.TargetException:
var nodeOperator = new NodeOperator(nodeInfo);
int dstRackId = 0;
int srcRackId = 0;
Assert.AreEqual(true, nodeOperator.DoSomething(dstRackId, srcRackId, srcModulebase));
A.CallTo(() => nodeInfo.CanAppendModule(dstRackId, srcModulebase, AppendDirection.Right)).MustNotHaveHappened();
}
В эта функция (DoSomething), мне все равно, если экземпляр moduleBase является правильным или нет. Кроме того, мне все равно, инициализированы ли свойства внутри moduleBase.
Поэтому я пишу приведенный ниже код для имитации свойства:
A.CallTo(() => srcModulebase.FieldBus.HardwareConfiguration.DdfInfo.UserDefine.InstallRestrictions.Position).Returns(ModulePosition.Right);
Но это вызывает Reflection. TargetException: «Нестандартные c методы требуют целей». Свойство FieldBus для srcModulebase равно нулю.
Как я могу просто игнорировать инициализацию внутри фальшивого класса и просто фальсифицировать нужное мне вложенное свойство?
Я знаю, что в этом случае я могу просто передать ModulePosition вместо ModuleBase, но Я просто хочу знать, как подделать вложенное свойство, как в этом случае.