1

私はこの質問をStoryQ ディスカッション ボードに投稿しましたが、他の質問への回答 (の欠如) を見ると、そこでの活動はせいぜいまばらに見えます。ここにいるみんなにやってもらいたいと思いました。

出力 (出力ウィンドウとファイルの両方) を変更または構成してカスタム文字列を含める方法はありますか? たとえば、私の話の 1 つでは、特定の例外をスローする必要があります。これを行うには、例外をキャッチして保存し、別のメソッドでそれが null ではなく、必要な型であることをテストします。例外のタイプを出力に追加できるようにしたいと思います (パラメーターがメソッド呼び出しに追加されるように)。

例えば

.Then(ExceptionIsThrown<ArgumentNullException>)

次の出力が得られます

then exception is thrown (ArgumentNullException)
4

2 に答える 2

2

StoryQ.Formatting名前空間を調べるように案内してくれたGiorgio Minardiに感謝します。そこで、単純な属性を使用してメソッドのフォーマットをオーバーライドできることを発見しました。

API はOverrideMethodFormatAttribute(抽象クラスからサブクラス化されたMethodFormatAttribute) を提供します。これは、特定の文字列定数を使用する場合に機能しますが、C# は属性内のメソッドの型パラメーターが好きではありません。これは、属性が原因でコンパイルされませんT:

[OverrideMethodFormat(string.Format("exception is thrown ({0})", typeof(T).Name))]
private void ExceptionIsThrown<T>() where T : Exception
{
    ...
}

MethodFormatAttribute解決策は、ジェネリック型のメソッドを具体的に検索して出力する別のサブクラスを作成することです。このサブクラスは以下のとおりです。

public class GenericMethodFormatAttribute : MethodFormatAttribute
{
    private readonly string _textFormat;

    public GenericMethodFormatAttribute()
    {
        _textFormat = null;
    }

    public GenericMethodFormatAttribute(string textFormat)
    {
        _textFormat = textFormat;
    }

    public override string Format(MethodInfo method,
                                  IEnumerable<string> parameters)
    {
        var generics = method.GetGenericArguments();
        if (_textFormat == null)
        {
            var genericsList = string.Join<Type>(", ", generics);
            return string.Format("{0} ({1})",
                                 UnCamel(method.Name),
                                 genericsList);
        }
        return string.Format(_textFormat, generics);
    }
}

使用方法は、オプションで文字列定数の代わりにフォーマット文字列を指定することを除いて、指定された属性とほとんど同じです。フォーマット文字列を省略すると、デフォルトの動作と同様に、メソッド名のキャメル ケースが解除されます。

[GenericMethodFormatAttribute]
private void ExceptionIsThrown<T>() where T : Exception
{
    ...
}

これにより、StoryQ コードに手を加えることなく、ソースで属性を宣言できます。拡張性のためのStoryQへの10ポイント!

于 2013-03-05T16:29:00.290 に答える
1

最良のことは、StoryQのソース、特にStoryQ.Formatting名前空間を調べることです。特定の出力を取得するには、フレームワーク内で使用されるFluenInterfaceパターンに従い、ストーリー内ThenExceptionIsThrown(Exception ex)の他のメソッドのように独自のメソッドを作成してチェーンする必要があります。

于 2013-03-05T15:07:43.023 に答える