Att integrationstesta WCF-tjänster

I en tidigare artikel skrev jag hur du kan isolera tjänsteimplementationen för att möjliggöra enhetstestning. Du kommer också behöva testa tjänsten i sin helhet eller åtminstone med flera enheter tillsammans.

Att köra manuella tester med hjälp av WCF Service Host och WCF Test Client är ett alternativ för att testa tjänsten i sin helhet. Manuella tester har sin plats i utvecklingscykeln men gapet mellan enhetstester och manuella tester bör fyllas med automatiserade integrationstester och funktionstester .

Då kommer vi till frågan hur vi på ett enkelt sätt kan husera WCF tjänsten och sedan exekvera de automatiserade testerna på den? Min rekommendation är att instansiera tjänstevärden inom ramen för din testklass (ServiceHost). För att slippa skriva all tråkig ServiceHost-kod nyttjer jag själv  ett bibliotek som kallas ServiceModelEx skrivet av Juval Löwy. Det  innehåller, bland mycket annat, klasser som förenklar konfigurering av WCF-värden. I sin absolut enklaste form räcker det med två rader kod; en rad för att instansiera tjänsten och öppna kanalen och en rad kod för att stänga kanalen och värden.

 [TestClass]
public class when_process_is_successfully_invoked : ContextSpecification {

    protected IMyService    Service;
    protected bool          Result;

    protected override void Context() {
        //create instance and open ipc channel
        Service = InProcFactory.CreateInstance<MyService, IMyService>();
    }

    protected override void Because() {
        //execute integration test
        Result = Service.Process();
    }

    [TestMethod]
    public void should_return_true() {
        //assert state
        Assert.IsTrue(Result);
    }

    public override void Cleanup() {
        //close channel
        InProcFactory.CloseProxy(Service);
    }
}

Så min rekommendation till dig är att surfa över till IDesign.net och ladda ned ServiceModelEx. Användandet av ServiceModelEx behandlas även i Juvals bok.