C#: AutoFixture refactoring

Posted by Thomas Jaskula on Stack Overflow See other posts from Stack Overflow or by Thomas Jaskula
Published on 2010-04-12T13:22:22Z Indexed on 2010/04/12 13:22 UTC
Read the original article Hit count: 372

Filed under:
|
|

Hello,

I started to use AutoFixture http://autofixture.codeplex.com/ as my unit tests was bloated with a lot of data setup. I was spending more time on seting up the data than to write my unit test. Here's an example of how my initial unit test looks like (example taken from cargo application sample from DDD blue book)

[Test]
        public void should_create_instance_with_correct_ctor_parameters()
        {
            var carrierMovements = new List<CarrierMovement>();

            var deparureUnLocode1 = new UnLocode("AB44D");
            var departureLocation1 = new Location(deparureUnLocode1, "HAMBOURG");
            var arrivalUnLocode1 = new UnLocode("XX44D");
            var arrivalLocation1 = new Location(arrivalUnLocode1, "TUNIS");
            var departureDate1 = new DateTime(2010, 3, 15);
            var arrivalDate1 = new DateTime(2010, 5, 12);

            var carrierMovement1 = new CarrierMovement(departureLocation1, arrivalLocation1, departureDate1, arrivalDate1);

            var deparureUnLocode2 = new UnLocode("CXRET");
            var departureLocation2 = new Location(deparureUnLocode2, "GDANSK");
            var arrivalUnLocode2 = new UnLocode("ZEZD4");
            var arrivalLocation2 = new Location(arrivalUnLocode2, "LE HAVRE");
            var departureDate2 = new DateTime(2010, 3, 18);
            var arrivalDate2 = new DateTime(2010, 3, 31);

            var carrierMovement2 = new CarrierMovement(departureLocation2, arrivalLocation2, departureDate2, arrivalDate2);

            carrierMovements.Add(carrierMovement1);
            carrierMovements.Add(carrierMovement2);

            new Schedule(carrierMovements).ShouldNotBeNull();
        }

Here's how I tried to refactor it with AutoFixture

[Test]
        public void should_create_instance_with_correct_ctor_parameters_AutoFixture()
        {
            var fixture = new Fixture();

            fixture.Register(() => new UnLocode(UnLocodeString()));

            var departureLoc = fixture.CreateAnonymous<Location>();
            var arrivalLoc = fixture.CreateAnonymous<Location>();
            var departureDateTime = fixture.CreateAnonymous<DateTime>();
            var arrivalDateTime = fixture.CreateAnonymous<DateTime>();

            fixture.Register<Location, Location, DateTime, DateTime, CarrierMovement>(
                (departure, arrival, departureTime, arrivalTime) => new CarrierMovement(departureLoc, arrivalLoc, departureDateTime, arrivalDateTime));

            var carrierMovements = fixture.CreateMany<CarrierMovement>(50).ToList();

            fixture.Register<List<CarrierMovement>, Schedule>((carrierM) => new Schedule(carrierMovements));

            var schedule = fixture.CreateAnonymous<Schedule>();

            schedule.ShouldNotBeNull();
        }

        private static string UnLocodeString()
        {
            var stringBuilder = new StringBuilder();

            for (int i = 0; i < 5; i++)
                stringBuilder.Append(GetRandomUpperCaseCharacter(i));

            return stringBuilder.ToString();
        }

        private static char GetRandomUpperCaseCharacter(int seed)
        {
            return ((char)((short)'A' + new Random(seed).Next(26)));
        }

I would like to know if there's better way to refactor it. Would like to do it shorter and easier than that. Thanks in advance for your help.

© Stack Overflow or respective owner

Related posts about autofixture

Related posts about unit-testing