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

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

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

internal class InnerClass
{
  private readonly string _description;

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

  public string GetDescription()
  {
    return _description;
  }
}

internal class OuterClass
{  
  public void DoSthWithExtension(int someNumber)
  {
    var innerClass = new InnerClass("InnerClassDescription");
    innerClass.Extension(someNumber);
  }
}

internal static class Extensions
{
  public static void Extension(this InnerClass innerClass, int someNumber)
  {
    var d = innerClass.GetDescription();
  }
}

 public void TestExtension()
{
  // I want to fake the method "InnerClass.Extension()"
  // which is called by "OuterClass.DoSthWithExtension()".
  // 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(() => Extensions.Extension(fakedInnerClasses, 11)).WithExactArguments().DoInstead(
    c =>
    {
      // The test doesn't go in here. The second parameter is correct,
      // the first one obviously not. But what is expected as a first parameter then?

      var oc2 = new OuterClass();

      // Here I call InnerClass.Extension() again.
      // The test should now go into the faked method underneath.
      oc2.DoSthWithExtension(22);
    });

  Isolate.WhenCalled(() => Extensions.Extension(fakedInnerClasses, 22)).WithExactArguments().DoInstead(
    c =>
    {
      // As above, the test code doesn't go in here.
    });

  // In here an instance of InnerClass is created and
  // InnerClass.Extension(11) is called.
  var oc1 = new OuterClass();
  oc1.DoSthWithExtension(11);
}

В качестве параметра this метода Extension я выбираю поддельные экземпляры InnerClass. То, что я предполагаю, необходимо. Но TypeMock не подводит меня к фальшивому методу. Очевидно, это неправильный параметр. Но какой мне тогда выбрать?

1 Ответ

1 голос
/ 03 октября 2019

Основываясь на комментариях и обновленном вопросе, часть, которая сбивает с толку, - то, зачем нужен другой внешний класс. Показанный внутренний класс не зависит от внешнего. Зачем макету тогда нужно создавать новый внешний класс?

Помимо этого, на основе документов кажется, что вам нужно настроить класс расширения, чтобы вы могли подделать статическое расширение. звонки.

Isolate.Fake.StaticMethods(typeof(Extensions));

//...

Оригинальный ответ

Не имитируйте метод расширения в этом случае. Вы знаете, что вызывает метод расширения. так что подделка.

public void TestExtension() {
    //Arrange
    string expected = "Fake result";
    var fakedInnerClasses = Isolate.Fake.AllInstances<InnerClass>();
    Isolate.WhenCalled(() => fakedInnerClasses.GetDescription())
        .WillReturn(expected);

    var subject = new OuterClass();

    //Act
    subject.DoSthWithExtension();


    //Assert
    //...
}

Так что теперь, когда вызывается внешний и вызывается метод расширения, он будет действовать на макет, контролируемый вами.

...