Как создать класс Moq, который инициализируется в методе, который вы тестируете?

#c# #unit-testing #moq

#c# #модульное тестирование #moq

Вопрос:

У меня есть метод, который инициализирует другой класс и что-то делает. Я хочу высмеять этот инициализированный класс, а также проверить его результаты. Ниже приведен пример того, чего я пытаюсь достичь

 public class Foo{
   private string value; 
   public Foo(string: value){
      this.value = value;
   }
   public string DoSomething(){
      var barService = new Bar(value);
      return barService.DoSomethingElse();
   }
}

public class Bar{
   public string DoSomethingElse(string: value){
      return "You got a "   value ;
   }
}

public class Runner{
   public void run(){
      var foo = new Foo("drink");
      print(foo.DoSomething()); // will print "You got a drink"
   }
}
 

Я пытаюсь написать тест Foo.DoSomething() , но мне нужно смоделировать bar.DoSomethingElse() и проверить, что Bar инициализирован с правильным значением.

Комментарии:

1. Может быть лучший подход, но вам может потребоваться создать фабрику (возможно, просто CreateBar метод) для создания Bar и вместо этого вызвать это.

2. Имеет ли Bar класс какие-либо внешние зависимости, такие как запрос к базе данных, доступ к файловой системе или веб-службам? Если нет — тогда не издевайтесь над ним., потому что вы сможете проверить, что DoSomethingElse вызывается с правильным аргументом, проверив конечный результат.

3. Это невозможно сделать с помощью Moq. Вы должны использовать такие тяжелые коммерческие инструменты, как MS Fakes, TypeMock, JustMock. Или бесплатный, но менее мощный и удобный: Prig, Pose, Harmony и т. Д.

4. У меня было ощущение, что это будет невозможно :/ Я мог бы попробовать изменить некоторые вещи в кодовой базе, чтобы обойти это

5. Это возможно. Но не с Moq. Однако лучше переработать дизайн и внедрить класс Bar в класс Foo извне.