我在StoryQ discussion boards上发布了这个问题,但是通过查看(缺乏)对其他问题的回答,活动似乎充其量只是稀疏。我以为我会让所有人都去参加。
有没有办法修改或配置输出(输出窗口和文件)以包含自定义字符串?例如,我的一个故事要求抛出特定的异常。为此,我捕获异常并保存它,然后在一个单独的方法测试中,它是非null和所需类型。我希望能够将异常的类型附加到输出(很像参数附加到方法调用)。
例如
.Then(ExceptionIsThrown<ArgumentNullException>)
将导致以下输出
then exception is thrown (ArgumentNullException)
答案 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)
,并将其链接到故事中的其他方法。