-> Gladh
>Ja det kvittar vad du kallar, jag visade bara på ett exempel där man vill få bort att man hämtar data i dess "riktiga" miljö eftersom det skulle bli extremt långsama tester.
LP: Jag vet inte om jag är otydlig :) Men integrationswrappern gör dina tester snabba eftersom det mockar dina objekt om du vill det. Alltså testerna är inte långsamma.
>Det där var inte mycket till exempel, hur vet din basklass att det är ett test som jag gör eller om det är ett anrop i produktion? Och nej preprocessor direktivet #Ifdebug är inte att rekomendera...
LP: Det finns många sätt att hantera detta på. Jag skulle inte använt mig av IfDebug. För det kan ju vara så att du vill ha databaskoppling i debug och inte mocka allt :) En väldigt enkelt sätt som jag gjorde var att skapa en inställning i config-filen som tex angav om det skulle mockas, skapas mock objekt dynamiskt, traca eller om datan tex skulle hämtas från databasen. Sedan kan man lägga på lite ytterligare alternativ som tex att mock objekten ska sparas i databasen, fil eller minnet m.m. Jag testade att spara mock objektet i databasen och läsa in det i minnet.
>Dessutom så kan du ju ha olika unittester som skall returnera olika resultat, hur implementerar du det i din basklass?
LP: Detta löste jag också lite lätt genom att spara det mockade objektet samt inparametrarna till metoden (inparametrarna blev nyckeln till ett specifikt mockobjekt) men det fanns en möjlighet att man kunde skipa nyckeln och använda sig av ett och samma mock objekt. Eller att man använda sig av ett default mockobjekt om man inte fick en träff på nyckeln.
>Det är inte speciellt ofta man byter databas, men det är betydligt oftare som man kanske byter sin OR/Mapper, man byter ut sin Loggingklass, man kan ha referenser till externa system via webservices eller WCF som byts ut ganska ofta.
LP: Vilket företag jobbar du på som byter OR-Mapper ofta i applikationen? :) Loggingklass har jag aldrig behövt byta ut under de snart 10 år jag jobbat (alltså inom en applikation). Det som dock hänt är att jag velat logga mer men det har inte påverkat applikationens loggdel något eller applikationen i övrigt stort. När jag började använda mig av en integrationswrapper så ville jag logga mer vid integrationsfel som tex sql-kommandot med dess inparametrar. Riktigt nice. Jag har också byggt det så att det är möjligt att traca och se exekueringstider på olika sql-kommandon (ungefär som SQL profiler) fast en light variant och som inte kräver rättigheter på SQL servern för att man ska behöva köra det. För det är inte ovanligt att SQL profiler är spärrad på tex produktionsservern.
En annan intressant sak som jag gjorde apropå stordator var att bygga en liten integrationswrapper runt stordatorkopplingar. Genom detta kunde jag enkelt traca m.m. vad som skickades in och ut. Jag byggde också en bra koppling mot stordatorns autogenererade gränssnitt. Denna funktionalitet var väldigt omtyckt av stordator-folket vilket underlättade deras arbete väldigt mycket. Det underlättade även .Net-teamens arbete.
>Att få ett löstkopplat system med en sådan liten kostnad som DI innebär, är värt det, speciellt ju större system och ju längre tid de skall leva. Det är min erfarenhet!
LP: Jag säger inte att DI är dåligt i alla avseenden. Det jag säger är att det finns alternativ till hur olika problem kan lösas.
- Om syftet med DI är att undvika integrationstester eftersom de är långsamma då finns det alternativ att använda sig av som tex en integrationswrapper. Genom detta erhåller du djupare tester än vad enhetstester och DI skulle kunna ge utvecklaren. Det räcker också att du skapar ett enda test för både integrationstest och icke-integrationstest. Via en enkel inställning så väljer du att tex köra lokalt icke-integrationstester för att snabbt erhålla feedback på det du gör. Exakt samma tester kan därefter köras på en byggserver fast med en annan inställning, dvs med integrationskoppling. Fördelen är att du har färre tester att förvalta samt att du erhåller snabbhet, djupare tester samt möjligheten till integrationstest i ett och samma test.
- Om syftet med DI är att löskoppla systemet så finns det olika nivåer man kan löskoppla det på. Om du löskopplar på områden som du aldrig har ett behov att löskoppla då är det slöseri med kundens pengar. Det kan vara svårt att avgöra i vissa fall vad som bör löskopplas och inte men genom erfarenhet bygger man upp en känsla för detta. Håller du med om att det är slöseri med kundens pengar om du löskopplar för mycket och aldrig behöver använda det?
>Det håller jag med dig i, det finns ju fortfarande folk som inte tagit till sig sådan enkla hjälpmedel som DI... "Ledsen kunde inte låta bli"
LP: Hehe, jag tar till mig DI i de sammanhang jag tycker det är vettigt att implementera det men jag implementera det inte överallt och jag ser att det finns bättre alternativ till DI vissa avseenden. Att implementera DI överallt för att det går tycker jag inte visar på hög kompetens :)