Как подделать вложенное свойство с помощью FakeItEasy? - PullRequest
0 голосов
/ 24 марта 2020

У меня есть класс, как показано ниже:

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, но Я просто хочу знать, как подделать вложенное свойство, как в этом случае.

1 Ответ

2 голосов
/ 24 марта 2020

Я нашел решение.

Мне нужно изменить все вложенные свойства внутри класса ModuleBase на Interface или пометить все из них как виртуальные.

Тогда я могу подделать его.

Как указано в документации Какие элементы могут быть переопределены :

После того, как фальшивка создана, ее методы и свойства могут быть переопределены, если они:

  • виртуальный,
  • аннотация или
  • метод интерфейса при фальсификации интерфейса
...