以前没有编写过单元测试框架,在我看来,如果程序集中的某些类型都需要进行类似的测试,那么可继承的Fact属性将使编写抽象测试类或测试接口变得更容易。
事实不可继承是否有设计原因?我认为其他使用属性来识别测试方法的测试框架(NUnit、MSTest、MbUnit等)也有类似的设计。我错过了什么?
以下是xunit的FactAttribute(版本1.9.1.1600)的开始:
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
public class FactAttribute : Attribute
{
我试图理解为什么它看起来不像下面这样:
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class FactAttribute : Attribute
{
FactAttribute是可继承的。
看看这篇文章:http://iridescence.no/post/Extending-xUnit-with-a-Custom-ObservationAttribute-for-BDD-Style-Testing.aspx
我觉得有时候它真的很有用。
我经常在测试中使用模板模式(这似乎是你试图实现的),它在xUnit.net上运行得很好。
public abstract class TestBase
{
[Fact]
public void Verify()
{
// Step 1
// Step 2
// Overridable step 3
DoStuff();
// Assert
}
protected abstract void DoStuff();
}
public class Test1 : TestBase
{
protected override void DoStuff()
{
// Test1 variation
}
}
public class Test2 : TestBase
{
protected override void DoStuff()
{
// Test2 variation
}
}
Verify执行两次——一次在实例Test1上,另一次在Test2的实例上。
希望这能有所帮助。
我从未听说过一个属性是可继承的,就像类一样。使用公共测试方法编写基类并将[Fut]特性应用于派生类中的方法应该不会有任何问题。