1

我在StoryQ 讨论板上发布了这个问题,但是通过查看对其他问题的(缺乏)回应,那里的活动充其量似乎很少。我想我会让这里的每个人都试一试。

有没有办法修改或配置输出(输出窗口和文件)以包含自定义字符串?例如,我的一个故事要求抛出一个特定的异常。为此,我捕获异常并将其保存,然后在单独的方法中测试它是否为非 null 且属于所需类型。我希望能够将异常的类型附加到输出(很像参数被附加到方法调用)。

例如

.Then(ExceptionIsThrown<ArgumentNullException>)

将导致以下输出

then exception is thrown (ArgumentNullException)
4

2 回答 2

2

感谢Giorgio Minardi指导我研究StoryQ.Formatting命名空间。在那里我发现我可以使用一个简单的属性来覆盖方法格式。

API 提供了一个OverrideMethodFormatAttribute(从抽象类子类化MethodFormatAttribute),如果您想使用特定的字符串常量,它可以工作,但 C# 不喜欢该方法在属性中的类型参数。T由于in 属性,这不会编译:

[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);
    }
}

用法几乎与提供的属性类似,只是您可以选择提供格式字符串而不是字符串常量。省略格式字符串 un-camel-cases 方法名称就像默认行为一样。

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

这使我可以在源代码中声明属性,而不必接触 StoryQ 代码。10 分给 StoryQ 的可扩展性!

于 2013-03-05T16:29:00.290 回答
1

最好的办法是查看 StoryQ 的来源,尤其是StoryQ.Formatting命名空间。要获得特定的输出,您应该遵循框架中使用的 FluenInterface 模式并编写自己的方法,类似于ThenExceptionIsThrown(Exception ex)故事中的其他方法并将其链接起来。

于 2013-03-05T15:07:43.023 回答