dbwebb-se / mvc

Course repo for the mvc and object orientation in frameworks course - mvc.
Other
1 stars 4 forks source link

Hur enhetstesta en privat variabel i en klass? #18

Open mosbth opened 3 years ago

mosbth commented 3 years ago

Jag har läst på en del i manualen om mocking och förstår hur man ändrar returvärden för en metod, men finns det någon möjlighet att mocka så man ändrar värdena av en privat variabel på klassen man testar, eller är det enklaste då att skapa en publik funktion, som ändrar det värdet?

Ett exempel är i 21-spelet, har jag en privat variabel för tärningshanden, jag hade velat ändra tärningshanden till ett mockat-tärningshandsobjekt.

Jag hade tänkt så här.

Jag testar mot klassernas publika API. Klassernas interna imlpementation, det som ligger bakom det publika API:et, kan jag inte nå direkt - bara indirekt via klassens publika API. Det är min grundtanke.

Om jag hamnar i ett läge som du är, så hade jag först funderat på hur testbar min klass är och om det finns problem med min implementation som hindrar dess testbarhet. Sen hade jag försökt skriva om klassens imlpementation för att göra den mer testbar.

Om det av någon anledning inte fungerar att testa, så hade jag börjat fundera på mocka eller skapa någon specialiserad klass som gör det enklare att testa. Kanske hade jag ändrat private till protected vilket hade gjort det möjligt att ärva ned klassen och göra den mer specialiserad med en egen klass som enbart används för testning. Det hade gett mig tillgång till den interna variabeln enbart för test.

Jag hade undvikit att lägga till metoder i klassens publika API:et om de enbart läggs till ur testningssyfte och "bra att ha, kanske, men definitivt för testning". Jag vill gärna inte fylla på med kod som inte behövs i applikationen.

I övrigt hade jag försökt att begränsa mitt mockande till att "kapa bort beroenden till andra klasser" för att göra en klass mer testbar. Men om man enbart följer "dependency injection" att man injectar de beroenden som en klass har, så blir det mycket enklare att testa då man kan injecta "anpassade mockade klasser".

Istället för att lägga "mycket kraft" på att mocka, så hade jag lagt den kraften på att skriva min kod så den blir mer testbar.