假设我们有一个 ICustomFormatter,旨在为一种类型(在本例中为 PersonName)提供内在支持。在处理 arg 参数时,大多数 MSDN 文档都有类似于下面的代码片段。
我可以想出一个 arg 为空的场景,如下面的测试所示,但是我对不是 PersonName 的 arg 类型的测试看起来非常做作。
什么是更现实的场景,其中 PersonNameFormatter 可能会使用不是 PersonName 的类型来调用?
代码
public class PersonNameFormatter : IFormatProvider, ICustomFormatter
{
public string Format(string format, object arg, IFormatProvider formatProvider) {
var pn = arg as PersonName;
if (pn != null) {
// formet it!!
}
try {
return HandleOtherFormats(format, arg);
}
catch (FormatException e) {
throw new FormatException(string.Format("The format of '{0}' is invalid.", format), e);
}
}
private static string HandleOtherFormats(string format, object arg) {
var formattable = arg as IFormattable;
if (formattable != null)
return formattable.ToString(format, CultureInfo.CurrentCulture);
return arg != null ? arg.ToString() : string.Empty;
}
}
测试 arg 为 null 的位置(现实)
[Test]
public void if_arg_is_null_then_string_empty_s_returned()
{
PersonName pn = null;
var result = string.Format("{0:G}", pn);
Assert.That(result, Is.EqualTo(string.Empty));
}
测试哪里 arg 是错误的类型(有效但做作??)
[Test]
public void if_arg_is_not_person_name_then_toString_for_that_arg_is_returned()
{
var result = PersonNameFormatter.Instance.Format("N2", 1, null);
Assert.That(result, Is.EqualTo(1.ToString("N2")));
}