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.
}
}