使用StoryQ修改或配置输出

时间:2013-03-05 14:44:27

标签: c# testing storyq

我在StoryQ discussion boards上发布了这个问题,但是通过查看(缺乏)对其他问题的回答,活动似乎充其量只是稀疏。我以为我会让所有人都去参加。

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

例如

.Then(ExceptionIsThrown<ArgumentNullException>)

将导致以下输出

then exception is thrown (ArgumentNullException)

2 个答案:

答案 0 :(得分:2)

感谢Giorgio Minardi指导我查看 StoryQ.Formatting 命名空间。在那里,我发现我可以使用简单属性覆盖方法格式。

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

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

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

这允许我在源代码中声明属性,而不必触及StoryQ代码。 StoryQ的十分指向可扩展性!

答案 1 :(得分:1)

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