Diseño ágil con TDD

8.6. En resumen

Para recapitular un poco veamos de nuevo todos los tests que hemos escrito hasta el momento, que han quedado bajo el mismo conjunto de tests, CalcProxyTests. Al final no hemos utilizado ningún doble de test y todos son tests unitarios puesto que cumplen todas sus reglas.

using System;
using System.Collections.Generic;
using System.Text;
using NUnit.Framework; // only nunit.framework dll is required
using SuperCalculator;
using Rhino.Mocks;

namespace UnitTests
{
    [TestFixture]
    public class CalcProxyTests
    {
        private Calculator _calculator;
        private CalcProxy _calcProxy;
        private CalcProxy _calcProxyWithLimits;

        [SetUp]
        public voidSetUp()
        {
            _calculator = new Calculator();
            _calcProxy = new CalcProxy(
                new Validator(-100, 100), _calculator);
            _calcProxyWithLimits =
                new CalcProxy(newValidator(-10, 10), _calculator);
        }

        [Test]
        public void Add()
        {
            int result =
                _calcProxy.BinaryOperation(_calculator.Add, 2, 2);
            Assert.AreEqual(4, result);
        }

        [Test]
        public void Substract()
        {
            int result = _calcProxy.BinaryOperation(
                _calculator.Substract, 5, 3);
            Assert.AreEqual(2, result);
        }

        [Test]
        public void AddWithDifferentArguments()
        {
            int result = _calcProxy.BinaryOperation(_calculator.Add, 2, 5);
            Assert.AreEqual(7, result);
        }

        [Test]
        public void SubstractReturningNegative()
        {
            int result = _calcProxy.BinaryOperation(
                _calculator.Substract, 3, 5);
            Assert.AreEqual(-2, result);
        }

        [Test]
        public void ArgumentsExceedLimits()
        {
            try
            {
                _calcProxyWithLimits.BinaryOperation(_calculator.Add, 30, 50);
                Assert.Fail(
                "This should fail as arguments exceeds both limits");
            }
            catch (OverflowException)
            {
                // Ok, this works
            }
        }

        [Test]
        public void ArgumentsExceedLimitsInverse()
        {
            try
            {
                _calcProxyWithLimits.BinaryOperation(
                    _calculator.Add, -30, -50);
                Assert.Fail(
                "This should fail as arguments exceeds both limits");
            }
            catch (OverflowException)
            {
                // Ok, this works
            }
        }

        [Test]
        public void ValidateResultExceedingUpperLimit()
        {
            try
            {
                _calcProxyWithLimits.BinaryOperation(
                    _calculator.Add, 10, 10);
                Assert.Fail("This should fail as result exceeds upper limit");
            }
            catch(OverflowException)
            {
                // Ok, this works
            }
        }

        [Test]
        public void ValidateResultExceedingLowerLimit()
        {
            try
            {
                _calcProxyWithLimits.BinaryOperation(
                    _calculator.Add, -20, -1);
                Assert.Fail("This should fail as result exceeds upper limit");
            }
            catch(OverflowException)
            {
                // Ok, this works
            }
        }
    }
}

Es un buen momento para hacer un commit en el sistema de control de versiones y cerrar el capítulo. Puede encontrar un archivo comprimido con el estado actual del proyecto en la web, para que lo pueda revisar si lo desea. En próximos capítulos podríamos hacer modificaciones sobre las clases actuales, por eso el archivo contiene expresamente la versión que hemos desarrollado hasta aquí.

En el próximo capítulo continuaremos el desarrollo de la Supercalculadora con C#, para seguir profundizando en la técnica del diseño dirigido por ejemplos o TDD. En el capítulo 11 implementaremos lo mismo desde el inicio con Python.


Copyright (c) 2010-2013 Carlos Ble. La copia y redistribución de esta página se permite bajo los términos de la licencia Creative Commons Atribución SinDerivadas 3.0 Unported siempre que se conserve esta nota de copyright.