Разбор Xml и отображение сообщений об ошибках - это отдельные задачи, поэтому у вашего анализатора не должно быть никаких знаний о том, как отображаются сообщения об ошибках.
В зависимости от ваших потребностей, есть несколько вариантов:
Исключения
Я часто живу по правилу: «Если метод не может выполнить свою работу, выведите исключение». Если вам нужно остановиться на первой ошибке, исключение - это путь.
С точки зрения модульного теста, если вы передаете недопустимые данные, убедитесь, что код выдает исключение, используя атрибут [ExpectedException].
[TestMethod, ExpectedException(typeof(ParserValidationException))]
public void IllegalDataShouldThrowValidationErrors()
{
var parser = new MyParser();
parser.Parse( dataThatContainsErrors );
}
Однако, если вам необходимо игнорировать недопустимые данные и сообщать об ошибках, вам может потребоваться другой подход.
Специализированный тип возврата
Если вам нужно собрать все ошибки, лучше сохранить проанализированный результат и ошибки вместе как объект.
public class ParsedResult<T>
{
public T Result;
public List<string> Warnings;
}
С точки зрения модульного теста вы должны убедиться, что список предупреждений не пуст, если вы передаете недопустимые данные.
[TestMethod]
public void ParsedResultsForIllegalDataShouldContainWarnings()
{
var parsedResult = new MyParser.Parse<Foo>( dataThatContainsErrors );
Assert.IsNotNull(parsedResult);
Assert.IsNotNull(parsedResult.Result);
Assert.AreEqual(1, parsedResult.Warnings.Count);
}
Ошибка Reporter
Введите сотрудника в объект и попросите его сообщить о результатах.
public ObjectToReturn Parse(string xml, IProgressReporter progress)
{
// create xml reader
// read values from xml
// if a value is invalid, log it
progress.AddMessage( "property x was invalid. ")
}
Отчет о прогрессе может быть оболочкой вашего MessageBox или выводом на консоль, регистратором и т. Д. С точки зрения модульного теста вы можете создать Test Double, который захватывает сообщения, или использовать макет. рамки и убедитесь, что он был вызван определенное количество раз. Вот пример, который использует Moq.
var mockReporter = new Mock<IProgressReporter>();
IProgressReporter reporter = mockReporter.Object;
var parser = new MyParser();
var illegalData = // your illegal data;
var result = parser.Parse( illegalData, parser);
Assert.IsNotNull(result, "The value was not parsed correctly.");
mockReporter.Verify( r => r.AddMessage( It.IsAny<string>() ), Times.AtLeast(1));