Desarrollo ágil

Inversión de dependencias

jj.github.io/curso-tdd/temas/inversión

✓ TODO

□ ¿Se han integrado tests en el gestor de tareas?

□ ¿Se ha configurado un sistema de CI?

Roles ⇒ inversión de dependencias ⇒ mocks

Composición frente a herencia

Roles son "clases incompletas"

Roles = módulos en Ruby

module Named
  attr_reader :name
end

class Project
  include Named
  attr_reader :issues, :milestones, :logger

  def initialize( name, logger )
    @name = name
    @logger = logger
    @issues = []
    @milestones = []
  end
# ... más
end

Inyectando dependencias: usando roles

Desacoplando diferentes funciones

Las dependencias son atributos en un objeto

unit class Project::Stored does Project;

has Project::Dator $!dator;

# Código de la clase aquí abajo
                            

Inyectando la dependencia

my $dator = Project::Data::JSON.new($data-file);
my $stored = Project::Stored.new($dator);

Usándolo en dobles de test

→ Sustituyen a los objetos originales

Dummies

equire "project"

PROJECT_NAME = 'Foo'

class NoLogger
end

describe Project do

  before do
    @project = Project.new(PROJECT_NAME,NoLogger.new() )
  end
# continúa
end

Stubs: también con interface

Fakes: clases falsas

unit class Project::Data::Fake does Project::Dator;

has $!data = { "milestones" => [
    {
        "2" => [
            {
                "4" => "Closed"
            },
            {
                "3" => "Open"
            }
        ]
    }
    ],
    "name" => "Foo"
};

A la hora de testear

$dator = Project::Data::Fake.new;
$stored = Project::Stored.new($dator);

Mocks: cualquier imitador de funcionalidad

Los frameworks pueden ayudar, pero no son exclusivos.

✓ TODO hito 14

Comenzar a integrar los servicios por inyección de dependencias

E integrar los tests correspondientes

Se usará el checks API para comprobarlo.