Wrapping a spec with a behavior

One very common use for a behavior is to wrap a spec in a transaction scope. This way, any changes the spec makes can be rolled back once the spec executes.

First, let's register the behavior:

WhenTesting<INeedATransaction>().EnrichWith<TransactionScopeWrapperBehavior>();

Now we just need the behavior and the marker interface:

public interface INeedATransaction : ISpecs
    {
    }

    public class TransactionScopeWrapperBehavior : Behavior<INeedATransaction>
    {
        private TransactionScope _scope;

        public override void SpecInit(INeedATransaction instance)
        {
            _scope = new TransactionScope();
        }

        public override void AfterSpec(INeedATransaction instance)
        {
            _scope.Dispose();
        }
    }

Any spec can now automatically wrap itself in a transaction scope just by implementing the INeedATransaction interface.