有没有办法在测试类之间共享断言而不在 NUnit 中继承?
考虑到您只想共享断言并且正在测试接口上的行为,您可以创建一些简单的东西:
public interface IBehavior
{
void Check();
}
public class VehicleThatHasBeenStartedBehaviors : IBehavior
{
protected IVehicle vehicle;
public VehicleThatHasBeenStartedBehaviors(IVehicle vehicle)
{
this.vehicle = vehicle;
}
public void Check()
{
Assert.That(vehicle.IsEngineRunning, Is.True);
Assert.That(vehicle.RevCount, Is.LessThanOrEqualTo(1000));
Assert.That(vehicle.RevCount, Is.GreaterThanOrEqualTo(0));
}
}
[TestFixture]
public class when_starting_a_car
{
protected Car car;
[SetUp]
public void SetUp()
{
car = new Car();
}
[Test]
public void behaves_like_a_started_vehicle()
{
new VehicleThatHasBeenStartedBehaviors(car).Check();
}
}
但是,如果您想专门使用 MSpec 语法,我认为您可能必须实现它或找到一些为您完成它的框架。
编辑
阅读您对这个问题的评论,我意识到您可能想要重用测试方法,而不仅仅是断言。如果是这种情况,您可以为 NUnit 编写自定义插件。这听起来可能有点矫枉过正,但由您决定。
我的出发点是编写一个定制的SuiteBuilder对象:
目的
SuiteBuilder 是用于从类型构建测试夹具的插件。NUnit 本身使用 SuiteBuilder 来识别和构建 TestFixtures。
使用您自己的套件构建器,您可以阅读一些行为类并组成您的固定装置。
[NUnitAddin]
public class TestCompositionAddinProvider : IAddin
{
#region IAddin Members
public bool Install(IExtensionHost host)
{
IExtensionPoint builders = host.GetExtensionPoint("SuiteBuilders");
if (builders == null)
return false;
builders.Install(new TestCompositionSuiteBuilder());
return true;
}
#endregion
}
public class TestCompositionSuiteBuilder : ISuiteBuilder
{
#region ISuiteBuilder Members
public bool CanBuildFrom(Type type)
{
//TODO: Create validation logic
return true;
}
public NUnit.Core.Test BuildFrom(Type type)
{
if (CanBuildFrom(type))
return new ComposedSuiteExtension(type);
return null;
}
#endregion
}
public class ComposedSuiteExtension : TestSuite
{
public ComposedSuiteExtension(Type fixtureType)
: base(fixtureType)
{
//TODO: Create logic to add test methods from various behaviors.
}
}