Events testen mit den xUnit.BddExtensions ( #xbddx )

Written on November 21, 2010

Will man testen, ob eine Klasse ein bestimmtes externes Event korrekt verarbeitet, kann man dies dank der Mocking-Features in den xUnit.BddExtensions leicht tun.

Angenommen, wir wollen testen, ob ein LichtSensor auf ein ein- bzw. ausgeschaltetes Licht reagiert, können wir das wie folgt testen:

using Xunit;

namespace LightSensor.Tests {
    [Concern(typeof (ILightSensor))]
    public class When_light_is_switched_on : InstanceContextSpecification<ILightSensor> {
        protected override void EstablishContext() {
        }

        protected override ILightSensor CreateSut() {
            return new LightSensor();
        }

        protected override void Because() {
            Sut.Watch(The<ILight>());
            The<ILight>()
                .Event(s => s.LightSwitched += (sender, args) => { })
                .Raise(this, new { LightState.On } );
        }

        [Observation]
        public void Should_be_detected_by_sensor() {
            Sut.LightState.ShouldBeEqualTo(LightState.On);
        }
    }
}

Entscheidend ist die Methode The(), welche ein Mock vom Typ ILight erzeugt und dieses zurückgibt.

Den Rest erledigt eigentlich RhinoMocks, welches in den xUnit.BddExtensions verwendet wird.

Das ILight-Mock wirft das Event LightSwitched mit dem Parameter LightState.On, welcher in der Observation entsprechend geprüft wird.

Weitere Details finden sich in der Beispiel-Solution, die hier heruntergeladen werden kann:

EventsBddExtensions.zip (1.32 mb)

DotNetKicks-DE Image