Ni som varit med på UnitTest Katan från mina workshops och är intresserade av hur klasserna såg ut efter showen slutade kan kolla här! Ni kan ju gärna fortsätta refactoringresan (finns en hel del roliga saker att fixa till innan vi kan få deg för den... ;-)). Unittesterna följer Roy Osheroves lysande namnsättningsstandard (MethodName_StateUnderTest_ExpectedBehavior()) som rockar när ni har 500 unittests och enkelt vill få en överblick av vad "¤#% klassen skall göra... Glöm inte att separera logik (unittest) från integration (allt annat; ado fippel, webservices, mainframes, hårtorkar). Mocka bort det så får ni schyssare design på en gång (hey, ännu en sak som en riktig Arkitekt borde designa in i en leading shadow om några teammedlemmar behöver hjälp på resan...). Om det är otroligt meckigt att mocka det aktuella objektet, FUSKA, eller strunta i det... Det är ingen lag, ni kommer inte hamna i fängelse... I PROMISE! En del saker är ett %¤&# att mocka och det är inte alltid värt det...

Idag gick vi över 2200 visits på bloggen under januari (17220 hits). Tack för att jag hela tiden får lära mig nya saker av er och för att ni orkar läsa mina fummliga minnesanteckningar! En resa kvar till Tess Ferrandez nivå men... Jag jobbar på det... Jag har världens bästa jobb!!! :-)

using Bowler;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace BowlerTest
{
[TestClass]
public class Bowler
{
private Game game;

[TestInitialize]
public void InitBowler()
{
game = new Game();
}

[TestMethod]
public void Bowl_OnePinDown_Scores1()
{
game.Roll(1);
Assert.AreEqual(1, game.Score);
}

[TestMethod]
public void Bowl_20roundsAllOnes_Scores20()
{
RollMany(20, 1);
Assert.AreEqual(20, game.Score);
}

private void RollMany(int roundsToRoll, int pinsDown)
{
for (int currentRound = 0; currentRound < roundsToRoll; currentRound++)
{
game.Roll(pinsDown);
}
}

[TestMethod]
public void Bowl_SpareAndFive_Scores20()
{
game.Roll(6);
game.Roll(4);
game.Roll(5);
RollMany(17, 0);
Assert.AreEqual(20, game.Score);
}

[TestMethod]
public void Bowl_TwoFourAndStrikeAndFiveTwo_Scores30()
{
game.Roll(2);
game.Roll(4);
game.Roll(10);
game.Roll(0);
game.Roll(5);
game.Roll(2);
RollMany(14,0);
Assert.AreEqual(30,game.Score);
}
}
}

namespace Bowler
{
public class Game
{
private int[] rounds = new int[21];
private int currentRound;

public int Score
{
get
{
int score = 0;
int frameIndex = 0;
for (int currentFrame = 0; currentFrame < 10; currentFrame++)
{
if (isStrike(frameIndex))
{
score += strikeScore(frameIndex);
}
else if (isSpare(frameIndex))
{
score += spareScore(frameIndex);
}
else
{
score += frameScore(frameIndex);
}
frameIndex += 2;
}
return score;
}
}

private bool isStrike(int frameIndex)
{
return rounds[frameIndex] == 10;
}

private int spareScore(int frameIndex)
{
return 10 + rounds[frameIndex + 2];
}

private bool isSpare(int frameIndex)
{
return rounds[frameIndex] + rounds[frameIndex + 1] == 10;
}

private int strikeScore(int frameIndex)
{
return 10 + rounds[frameIndex + 2] + rounds[frameIndex + 3];
}

private int frameScore(int frameIndex)
{
return rounds[frameIndex] + rounds[frameIndex + 1];
}

public void Roll(int pinsDown)
{
rounds[currentRound] = pinsDown;
currentRound++;
}
}
}

I, I was only wondering
If you could ever change your mind
You could give it up but soemthing might happen
It's all too much but something might happen
You'll break this cup but something might happen

So break this cup 'cause something might happen...