Модульное тестирование - это не то, что вы добавляете в середину существующих методов, оно касается тестирования небольших блоков кода изолированно от остальной системы, чтобы вы были уверены, что модуль ведет себя так, как должен.
Итак, вы должны написать второй класс, единственная ответственность которого заключается в том, чтобы проверить, что класс, в котором живет DoSomething
(назовем этот класс Daddy
и тестовый класс DaddyTests
), ведет себя так, как вы ожидаете. Затем вы можете написать тестовый метод, который вызывает DoSomething
и гарантирует, что ErrorMessage
установлен правильно (также ErrorMessage
должен быть параметром out
, а не ref
, если вы также не передаете значение в).
Чтобы упростить этот тест, вам нужно убедиться, что GetData
не возвращает никаких данных. Обычно это можно сделать, передавая пустой набор данных в фальшивый провайдер, но в более сложных сценариях может потребоваться замена целых классов на фальшивые / фиктивные эквиваленты: использование интерфейсов и внедрение зависимостей делает эту задачу очень простой. (Обычно поставщик устанавливается во время создания Daddy
, а не в качестве параметра при вызове DoSomething
.)
public class Daddy {
public List<MyClass> DoSomething(string Name, string Address, string Email, out string ErrorMessage, IDataProvider provider)
{
//Check for empty string parameters etc now go and get some data
List<MyClass> Data = provider.GetData(Name, Address, Email);
if (Data.Count == 0)
{
ErrorMessage = "Oh noes";
return Enumerable.Empty<MyClass>();
}
List<MyClass> formattedData = FormatData(Data);
return formattedData;
}
}
[TestClass]
public class DaddyTest {
[TestMethod]
public void DoSomethingHandlesEmptyDataSet() {
// set-up
Daddy daddy = new Daddy();
// test
IList<MyClass> result = daddy.DoSomething("blah",
"101 Dalmation Road",
"bob@example.com",
out error,
new FakeProvider(new Enumerable.Empty<AcmeData>())); // a class we've written to act in lieu of the real provider
// validate
Assert.NotNull(result); // most testing frameworks provides Assert functionality
Assert.IsTrue(result.Count == 0);
Assert.IsFalse(String.IsNullOrEmpty(error));
}
}
}