Прежде всего, как вы упомянули, вы можете заменить зависимости на макеты. Код, который вы опубликовали, не содержит большого количества зависимостей, но давайте представим, что он есть.
Вы тестируете метод IsStringEmptyOrNull.
Давайте предположим, что метод принадлежит классу с именем Foo (я просто придумываю). Я тоже немного поменяю метод.
public class Foo
{
private IBar _bar;
public Foo(IBar bar)
{
_bar = bar;
}
public static bool IsStringEmptyOrNull(string strValue)
{
// dependency is called here
var readValue = bar.ReadFromFileSystemOrDatabase();
if(null != strValue
&& readValue == 1)
{
strValue = strValue.Trim().ToLower();
return (string.Empty == strValue || "undefined" == strValue);
}
return true;
}
}
Здесь вы можете видеть, что у класса Foo есть Bar, который вставляется в конструктор. Также он используется в вашем методе. Если вы не хотите, чтобы ваш тест действительно вызывал этот метод:
- потому что он звонит в db
- потому что он обращается к файловой системе
- вы хотите изолировать код от метода, от другого внешнего кода (в данном случае ReadFromFileSystemOrDatabase ()
Затем вы можете использовать макет, чтобы подтвердить это.
Вот как бы вы это сделали:
// create your mock object
var mockBar = new Mock<IBar>();
// setup a method to return a result when the mock object is called
// notice the return value, which is 1
mockBar.Setup(mock => mock.ReadFromFileSystemOrDatabase()).Returns(1);
// you can then inject the mock object in the object you are testing
var foo = new Foo(mockBar.Object);
То, что произойдет, это то, что при выполнении теста классу будет передана фиктивная версия зависимости (в данном случае Bar).
Когда метод вызовет этот макет, если у вас есть Setup метод для возврата значения, он вернет это значение.
Таким образом, вы можете абстрагировать зависимости, чтобы сфокусировать свои тесты или смоделировать вызовы в БД или в файловую систему.
Что касается приведенного вами точного примера, то тут не над чем издеваться. Точный пример не подходит для использования макетов.
Мухи - это не то, что вы бы сделали для всех своих тестов.