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);
}
錯誤記者
傳遞一個合作者到對象並將其舉報的調查結果。
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的包裝,或者它可能是一個控制檯輸出,記錄儀等。從單元測試的角度來看,你可以創建一個測試雙捕獲的消息,或者你可以使用模擬框架並驗證它被稱爲一定的次數。這是一個使用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));