Typemock: снова вызвать поддельный метод внутри поддельного метода - PullRequest
0 голосов
/ 03 октября 2019

Я пишу тесты для нашего приложения на C # 7 и борюсь с издевательством над конкретным методом. Я использую TypeMock 8.6.10.3.

Вот упрощенный пример:

  // Returns some data
  class InnerClass
  {
    private readonly string _description;

    public InnerClass(string description)
    {
      _description = description;
    }

    // This is the method I want to fake.
    public string GetDescription()
    {
      return _description;
    }
  }

  // Calls InnerClass
  class OuterClass
  {
    public void DoSth()
    {
      // Instance of InnerClass is created in this method scope.
      // This instance is not accessible from outside.
      var innerClass = new InnerClass("InnerClassDescription");
      var d = innerClass.GetDescription();
    }
  }

  public class TestFixture
  {
    public void Test()
    {
      // I want to fake the method "InnerClass.GetDescription()"
      // which is called by "OuterClass.DoSth()".
      // I don't have access to the InnerClass instance though.
      // So unfortunately I have to fake them all.
      var fakedInnerClasses = Isolate.Fake.AllInstances<InnerClass>();

      Isolate.WhenCalled(() => fakedInnerClasses.GetDescription()).DoInstead(
        c =>
        {
          // I create another instance of OuterClass...
          var oc2 = new OuterClass();

          // ...and call the same method GetDescription() indirectly again.
          // I would expect that the test goes
          // into this faked method one more time.
          // But it does not. The real GetDescription() is called.
          // How to change this behavior?
          return oc2.DoSth();
        });

      var oc1 = new OuterClass();

      // Because DoSth() calls GetDescription()
      // the test will go to the faked method right above.
      oc1.DoSth();
    }
  }

Я также попытался подделать метод GetDescription() еще раз в самом фальшивом методе (вложенныйWhenCalled() звонок). Надеясь, что второй звонок войдет туда. Но, насколько я знаю, вторая подделка просто перезаписывает первую.

В реальном приложении GetDescription() принимает некоторые параметры. Я мог бы подделать GetDescription() дважды, используя WithExactArguments(). Таким образом, я мог дифференцировать звонки. Но поскольку GetDescription() является методом расширения, я не нашел способа подделать параметр this. Подделка всех экземпляров не работает.

Мне действительно нужны вопросы, и мне нужен один ответ для решения моей проблемы:

  • Могу ли я подделать конкретный экземпляр, не имея возможности получить к нему доступ? (InnerClass экземпляр в методе DoSth())? Пока я знаю, что это невозможно.
  • Могу ли я вызвать фальшивый метод второй раз, второй раз в самом фальшивом методе, и предположить, что второй вызов снова завершится в этом фальшивом методе (вызов GetDescription() опять в фальшивом GetDescription() звонке)?
...