#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 извне.