1

型 (この場合は PersonName) の組み込みサポートを提供するように設計された ICustomFormatter があるとします。arg パラメーターの処理に関しては、ほとんどの MSDN ドキュメントに、以下のスニペットのようなコードがあります。

以下のテストで示されているように、arg が null になるシナリオを思いつくことができますが、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")));
    }
4

0 に答える 0