Läsbara tester med extension methods

Skriv en kommentar
8 maj 2009 23:11

Som jag nämnde i mitt senaste inlägg

kan vi enkelt skapa mer läsbara tester genom att använda oss av extension methods. Vad vi vill uppnå med dessa metoder är ett sätt att slippa skriva våra vanliga verifieringar enligt följande:

Assert.AreEqual(1000.0, order.TotalAmount());
Istället vill vi få till en läsbar verifering enligt följande:

totalAmount.ShouldEqual(1000);

nBehave har en bra klass med extension methods att utgå ifrån. S#arp Architecture

har anammat samma approach, men har samtidigt lagt till några mer specifika metoder som exempelvis följande:

public static void ShouldEqualSqlDate(this DateTime actual, DateTime expected)
{
    TimeSpan timeSpan = actual – expected;
    Assert.Less(Math.Abs(timeSpan.TotalMilliseconds), 3);
}

och

public static void ShouldContainErrorMessage(this Exception exception, string expected){
    StringAssert.Contains(expected, exception.Message);
}

Som ni ser är metoderna väldigt enkla att skapa själv. Vi kan exempelvis skapa en läsbar verifiering av ett värde med två decimaler enligt följande:

using NUnit.Framework;

namespace
ExtensionMethods

{
    public static class TestExtensions
    {
        public static void ShouldEqualRoundedValue(this double
       
actual, double
expected)
        {
            // 0.005 är deltat
            Assert.AreEqual(expected, actual, 0.005);
        }
    }
}

Självklart ska vi även testa våra egna veriferingsmetoder:

using NUnit.Framework;

namespace
ExtensionMethods
{
    [TestFixture]
    public class ShouldEqualRoundedValueTests
    {

        [Test]
        public void CanRoundCorrectWhenRoundingDown()
        {
            const double amount = 100.124;
            amount.ShouldEqualRoundedValue(100.12);
        }


        [
Test]
        public void CanRoundCorrectWhenRoundingUp()
        {
            const double amount = 100.126;
            amount.ShouldEqualRoundedValue(100.13);
        }


        [
Test]
        public void CanRoundCorrectWhenInBetween()
        {
            const double amount = 100.125;
            amount.ShouldEqualRoundedValue(100.13);

        }

        [Test]
        public void CanRoundAmountCorrectWhenAssertFails()
        {
            const double amount = 100.125;

            try
           
{
                amount.ShouldEqualRoundedValue(100.14);
                Assert.Fail(”The test should fail!”);
            }
            catch (AssertionException exc)

            {
                Assert.AreNotEqual(”The test should fail!”,
                exc.Message);
            }
        }

    }
}


Snygg och enkel verifiering!

Kommentera inlägget

Artikelkommentatorerna ansvarar själva för sina inlägg.

Var god skriv in texten du ser nedan:

XHTML: Ni kan använda er av följande taggar: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>


Cloud Magazine-nytt

Mest läst just nu

Senaste testerna

Mest kommenterade

Bloggare

Heta whitepaper

Senaste nytt 100 senaste | Arkiv | RSS | Läsarfavoriter

IDG.se bottom line
Dagens dilbert
Dagens dilbert via idg en enkel XML som visar dagens Dilbert
Städjes skriverier

Sveriges vassaste it-krönikörer

Krönikor

Dags för Dell att lyfta blicken

HiQ har ännu mer att ge

Bygg en bro mellan vd:n och cio:n

Tre spikar har hjälpt mig i soppkoket

Sluta simulera bibliotek - e-böcker hör inte hemma där


It-nyheter efter ämne
Outsourcing

AdtechHar du synpunkter på sajten? Kontakta ansvarig utgivare: Carl Grape | Kontakta IDG.se | Tipsa om en nyhet |
Så använder vi cookies | Om Personuppgifter & copyright
Karlbergsv. 77 106 78 Stockholm Tel: 08-453 60 00 Karta | Copyright © International Data Group