<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Pablo Alonso García &#187; Ruby on Rails</title>
	<atom:link href="http://alonsogarciapablo.com/blog/category/ruby-on-rails/feed/" rel="self" type="application/rss+xml" />
	<link>http://alonsogarciapablo.com/blog</link>
	<description>Desarrollo de software, desarrollo web, metodologías ágiles, internet.</description>
	<lastBuildDate>Wed, 03 Aug 2011 22:52:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.3</generator>
		<item>
		<title>Una semana de trabajo en BeBanjo</title>
		<link>http://alonsogarciapablo.com/blog/una-semana-de-trabajo-en-bebanjo/</link>
		<comments>http://alonsogarciapablo.com/blog/una-semana-de-trabajo-en-bebanjo/#comments</comments>
		<pubDate>Mon, 01 Aug 2011 16:34:15 +0000</pubDate>
		<dc:creator>Pablo</dc:creator>
				<category><![CDATA[Desarrollo web]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[bebanjo]]></category>
		<category><![CDATA[pair programming]]></category>
		<category><![CDATA[Ruby On Rails]]></category>
		<category><![CDATA[VOD]]></category>

		<guid isPermaLink="false">http://alonsogarciapablo.com/blog/?p=673</guid>
		<description><![CDATA[Durante el pasado de mes de Julio, tuve la gran oportunidad de pasar una semana trabajando con los increíbles chicos de BeBanjo. En cuanto me enteré de que están buscando gente para ampliar su equipo, decidí escribir a Luismi Cavallé para obtener más información al respecto. Y cual fue mi sorpresa cuando me propusieron trabajar [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://bebanjo.com/"><img src="http://alonsogarciapablo.com/blog/wp-content/uploads/2011/08/BeBanjo.jpg" alt="BeBanjo - A better way to manage your VOD services" title="BeBanjo - A better way to manage your VOD services"  class="aligncenter size-full wp-image-674" /></a></p>
<p>Durante el pasado de mes de Julio, tuve la gran oportunidad de pasar <strong>una semana trabajando con los increíbles chicos de <a href="http://bebanjo.com/" rel="external">BeBanjo</a></strong>. En cuanto me enteré de que <a href="http://twitter.com/#!/cavalle/status/80921455017197568" rel="external">están buscando gente para ampliar su equipo</a>, decidí escribir a <a href="http://www.lmcavalle.com/" rel="external">Luismi Cavallé</a> para obtener más información al respecto. Y cual fue mi sorpresa cuando <strong>me propusieron trabajar una semana con ellos</strong>. Claro: <strong>¿qué mejor forma de conocer a tus candidatos que trabajar una semana con ellos?</strong>. Mucha gente no entendía que fuese a una empresa a trabajar sin cobrar un duro, pero ¡yo no lo dudé ni un minuto! <img src='http://alonsogarciapablo.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>La experiencia fue genial para mí. Fueron sólo 5 días pero personalmente me aportó mucho. Por eso, y en primer lugar, quiero <strong>dar las gracias a <a href="http://www.linkedin.com/in/jorgesancha" rel="external">Jorge Gomez Sancha</a> y <a href="http://www.linkedin.com/in/bastianm" rel="external">Bastian Manintveld</a> por la invitación. Thanks!</strong>. </p>
<p>Paso a resumir algunas de las <strong>buenas prácticas y aspectos que más me llamaron la atención</strong> y por las que opino que realmente merece mucho la pena trabajar en BeBanjo:</p>
<h2>A nivel técnico</h2>
<p>Llevaba mucho tiempo deseando trabajar en algún proyecto Rails &#8220;de la vida real&#8221; y con un equipo maduro que realmente llevara mucho tiempo trabajando con el framework. Ya había asistido a una <a href="http://alonsogarciapablo.com/blog/retrospectiva-de-agile-spain-2010-la-primera-conferencia-sobre-metodos-agiles-en-espana#testing-de-aceptacion-con-luismi-y-sergio" rel="external">sesión sobre Testing de aceptación en Ruby impartida por Luismi y Sergio Gil</a> y eso me motivó mucho a escribirles. A nivel técnico, me llamó la atención:</p>
<h3>La programación por parejas: un ordenador, dos pantallas, dos teclados, y dos ratones</h3>
<p>Reconozco que nunca había <a href="http://en.wikipedia.org/wiki/Pair_programming" rel="external">programado en pareja</a> de una forma tan intensiva. Sí lo había hecho para resolver algún problema complejo concreto, pero no durante jornadas completas. La experiencia fue muy positiva. En BeBanjo tuve la oportunidad de comprobar la <strong>productividad y calidad que se consigue cuando dos cabezas están resolviendo un mismo problema</strong>.</p>
<p>El hecho de tener una persona al lado, con quien poder discutir una determinada solución, no sólo ayuda a obtener un mejor código, sino que también consigue que <strong>ambas partes estén completamente concentradas en su trabajo</strong>. Trabajando con Luismi comprendí que <strong>el hecho de exponer el problema a otra persona de una forma oral, ayuda a darse cuenta de muchas cosas que de forma introspectiva sería difícil descubrir</strong>.</p>
<p>Y si a eso le sumas <strong>la <a href="http://www.pomodorotechnique.com/" rel="external">técnica del Pomodoro</a> sincronizada</strong> entre todos los miembros del equipo con <a href="http://tomatoi.st/" rel="external">tomatoi.st</a>, un sencillo tablero kanban y una planificación al comienzo de cada día: <strong>¡la productivad es brutal!</strong> <img src='http://alonsogarciapablo.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<h3>El ciclo BDD/TDD: ¡las pruebas primero!</h3>
<p><strong>¡En BeBanjo siempre escriben los tests primero!</strong>. Y gracias a esta experiencia puede ver a un <a href="http://www.lmcavalle.com/2009/02/10/how-we-do-bdd.html" rel="external">equipo real con su propia forma de hacer BDD/TDD</a>, es decir, programando primero cuál es el comportamiento esperado desde el punto de vista del usuario en forma de test para después codificar una solución lo más elegante posible. Esto hace posible <strong>desarrollar nuevas funcionalidades sin apenas abrir el navegador</strong>.</p>
<p>En el caso de Ruby On Rails, tuve la oportunidad de trabajar con el <a href="http://github.com/cavalle/steak" rel="external">famoso Steak</a>, y también pude ver a <a href="http://pivotal.github.com/jasmine/" rel="external">Jasmine</a> en acción <img src='http://alonsogarciapablo.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Lo mejor que he aprendido referente a este tema es, a parte del enfoque BDD, que <strong>no existe una forma definitiva de probar tu código</strong> sino que cada equipo/persona debe elegir qué <em>aproach</em> le aporta más valor y seguridad&#8230; Por otro lado, he aprendido que hay cosas bastante triviales que no merece la pena probar.</p>
<h3>El workflow con git: varias ramas y un buen entorno</h3>
<p>He de reconocer que a nivel profesional sólo he trabajado con Subversion. Conozco GIT gracias a <a href="https://github.com/" rel="external">GitHub</a> y algún proyecto que he desplegado en <a href="http://www.heroku.com/" rel="external">Heroku</a>.</p>
<p>En BeBanjo tienen muy bien planteando <a href="http://www.slideshare.net/sergio.gil/a-git-workflow" rel="external">su flujo de trabajo con git</a>. Descubrí bastante comandos de git y los problemas que puede ocasionar el trabajar con una única rama <em>master</em>.</p>
<p>Ni que decir tiene, que <a href="http://en.wikipedia.org/wiki/Release_early,_release_often" rel="external">los <strong>despliegues en producción son bastante frecuentes</strong></a> y que cualquier miembro del equipo puede <strong>desplegar nuevas funcionalidades sin miedo a romper algún código anterior</strong>.</p>
<h3>Excelencia técnica y <em>happy programmers</em></h3>
<p>Poco puedo contar de <a href="https://github.com/cavalle" rel="external">Luismi</a>, <a href="https://github.com/porras" rel="external">Sergio Gil (Porras)</a> y <a href="https://github.com/christos" rel="external">Christos Zisopoulos</a> que no se sepa ya. A nivel técnico cuentan con una gran experiencia y son <strong>desarrolladores muy &#8220;visibles&#8221; y activos en el panorama Ruby nacional e internacional</strong>, lo cual dice mucho sobre sus perfiles y los convierte en grandes compañeros de trabajo. Pero <strong>lo más importante de todo es que disfrutan con su trabajo</strong>. </p>
<p>En este punto he de <strong>agradecerles a los tres su gran paciencia a la hora de responder mis infinitas preguntas</strong>, y en especial a Luismi que fue con quién más trabajé y de quién más pude aprender <img src='http://alonsogarciapablo.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> . Thanks!</p>
<h2>A nivel de empresa</h2>
<p>Al mismo tiempo, <strong>tenía muchas ganas de vivir el ambiente de una <a href="http://alzado.org/articulo.php?id_art=895" rel="external">empresa de producto</a> tipo <em>startup</em></strong>. El hecho de que mi estancia coincidiera con un cambio de oficina me hizo estar implicado en situaciones bastante divertidas y a su vez curiosas por las que supongo toda startup debe pasar algún día. BeBanjo me parece una buena empresa por los siguientes aspectos:</p>
<h3>El buen ambiente de trabajo: felt like home!</h3>
<p><a href="http://bebanjo.com/about">Los miembros de BeBanjo</a><strong> me hicieron sentir como en casa desde el minuto nº1</strong>. Pocas veces me he sentido tan cómodo en un ambiente de trabajo en tan sólo una semana. He de reconocer que durante esa semana no tuve la sensación de ir a &#8220;trabajar&#8221;. Horarios flexibles, mucha comunicación entre el equipo, reuniones informales, comidas muy distendidas, y mi gran inquietud por aprender con<strong> ellos lograron que el día a día fuese super ameno</strong>.</p>
<h3>Productos nicho que resuelven necesidades reales</h3>
<p>El éxito de BeBanjo radica en que sus <strong>productos están enfocados a un nicho de mercado muy específico</strong>. Los fundadores detectaron que las empresas que ofrecen contenidos de video bajo demanda tienen determinados problemas a la hora de gestionar la información sobre sus referencias (series, películas, etc) y la publicación en diversas plataforma. Entonces <strong>diseñaron y desarrollaron varias aplicaciones (<a href="http://bebanjo.com/sequence" rel="external">Sequence</a>, <a href="http://bebanjo.com/movida" rel="external">Movida</a> y <a href="http://bebanjo.com/metadata">Metadata</a>) enfocadas a ayudar a estas empresas</strong>. Un punto clave en este aspecto es la <strong>gran colaboración de los clientes en todo este proceso</strong>.</p>
<h3>Concienciación de la importancia del diseño</h3>
<p>Sin duda, en BeBanjo saben lo importante que es el buen diseño de producto y por eso trabajan con los mejores. No pude conocer personalmente a <a href="http://sofanaranja.com/" rel="external">Ale Muñoz</a> pero sin duda ha hecho un gran trabajo en el diseño de los actuales productos de BeBanjo. Actualmente están buscando diseñadores todo-terreno y estoy convencido que no tardarán en encontrar a algún crack en este campo.</p>
<h3>La importancia de un buen equipo comercial y una clara orientación a cliente</h3>
<p>Hace tiempo que soy consciente de <strong>la importancia de un buen equipo comercial a la hora de desarrollar productos tecnológicos de éxito</strong>. De poco o nada sirve tener un producto excelente a nivel técnico si los posibles compradores no conocen acerca de su existencia&#8230; En este sentido creo que<strong> ambos socios realizan una gran labor a la hora de establecer nuevos contactos comerciales y en el trato diario con el cliente</strong>. </p>
<h3>Su enfoque internacional: pensando en grande</h3>
<p>Me llamó mucho la atención el <strong>enfoque claramente internacional de esta pequeña gran empresa</strong>&#8230; No era raro escuchar a lo largo del día muchas conversaciones de fondo en inglés o francés. Parece de perogrullo pero&#8230; <strong>¿por qué limitarse al mercado nacional?</strong> Y este enfoque no se limita a la parte de captar clientes, sino también a la hora de contratar nuevos empleados&#8230; <strong>¿por qué no contratar a gente con talento de otros países?</strong>.</p>
<p style="margin-top:40px">
Podría seguir escribiendo&#8230; pero no me quiero extender mucho más. Aprovecho para agradecer de nuevo a todos los miembros de BeBanjo y <strong>me despido recomendado a todo el mundo vivir una experiencia de este tipo. Merece la pena.
</p>
<p>¡Gracias BeBanjo!</strong> </p>
]]></content:encoded>
			<wfw:commentRss>http://alonsogarciapablo.com/blog/una-semana-de-trabajo-en-bebanjo/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Introducción a los módulos en Ruby</title>
		<link>http://alonsogarciapablo.com/blog/modulos-en-ruby/</link>
		<comments>http://alonsogarciapablo.com/blog/modulos-en-ruby/#comments</comments>
		<pubDate>Thu, 12 May 2011 07:54:17 +0000</pubDate>
		<dc:creator>Pablo</dc:creator>
				<category><![CDATA[Desarrollo web]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[autoload]]></category>
		<category><![CDATA[extend]]></category>
		<category><![CDATA[include]]></category>
		<category><![CDATA[load]]></category>
		<category><![CDATA[mixin]]></category>
		<category><![CDATA[modules]]></category>
		<category><![CDATA[modulos]]></category>
		<category><![CDATA[require]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://alonsogarciapablo.com/blog/?p=603</guid>
		<description><![CDATA[Llega un momento en la vida del programador Ruby en que, de forma natural, empieza a indagar en el código escrito por otras personas, por ejemplo en proyectos alojados en GitHub. En estos proyectos se empieza a ver cómo se hace uso de los módulos, mixins, etc. Pero no siempre es fácil de entender todos [...]]]></description>
			<content:encoded><![CDATA[<p>Llega un momento en la vida del programador Ruby en que, de forma natural, empieza a indagar en el código escrito por otras personas, por ejemplo en proyectos alojados en <a href="http://github.com" rel="external">GitHub</a>. En estos proyectos se empieza a ver cómo se hace uso de los módulos, mixins, etc. Pero no siempre es fácil de entender todos estos conceptos.</p>
<p>Con este post pretendo <strong>ayudarte a entender bien los módulos de ruby</strong> para, por ejemplo, aprender cómo dividir bien el código en módulos, entender el código de las gemas, extender el comportamiento de Rails, etc&#8230;</p>
<h2>¿Qué es un módulo?</h2>
<p>Un módulo es una <strong>agrupación de métodos, clases y constantes</strong>. Mediante el uso de módulos, podemos dividir un programa o sistema en varias partes independientes y reutilizables que interactúen entre sí. Si estás familiarizado con Java, el concepto de módulo podría asimilarse al concepto de paquetes.</p>
<p>Uno podría pensar que esta definición es similar a la de una Clase, que también tiene métodos, clases y constantes&#8230; Sin embargo, la <strong>diferencia fundamental respecto a las clases, es que no se pueden crear instancias de un módulos</strong>.</p>
<p>Como ejemplo de módulo tenemos <a href="http://www.ruby-doc.org/core/classes/Math.html" rel="external">el módulo Math</a>, que recopila mayormente funciones para operaciones trigonométricas. Y que </p>
<h2>¿Cómo se define un módulo?</h2>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">module</span> MyModule
&nbsp;
  MY_CONSTANT = <span style="color:#996600;">'...'</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> MyModule.<span style="color:#9900CC;">my_method_1</span>
    ...
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> my_method_2
     ...
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  ...
&nbsp;
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#6666ff; font-weight:bold;">MyModule::MY_CONSTANT</span>
...
<span style="color:#9900CC;">MyModule</span>.<span style="color:#9900CC;">my_method_1</span></pre></div></div>

<p>El ejemplo define un módulo de nombre &#8216;MyModule&#8217; con una constante MY_CONSTANT. Vemos que el módulo tienes 2 métodos: un primer <strong>método de módulo</strong>, llamado &#8220;my_method_1&#8243;, que sería equivalente a un método estático de una clase; y un segundo método, &#8220;my_method_2&#8243;, que sería un <strong>método de instancia</strong>. ¿Método de instancia? ¿No me acabas de decir que los módulos no tienen instancias? Lo veremos un poco más abajo <img src='http://alonsogarciapablo.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Como hemos visto, podemos acceder al valor de una constante a través de &#8220;::&#8221; y el nombre de la constante. La invocación de los métodos de módulo sería similar a la invocación de un método estático.</p>
<h2>Principales usos de los módulos</h2>
<h3>Definición de espacios de nombres</h3>
<p>Cuando los programas crecen, surge la <strong>necesidad de organizar de alguna forma todas las partes de la aplicación que están de alguna forma relacionadas entre sí</strong>. En el caso del módulo Math, queda claro que todas esas funciones están tan relacionadas que deben habitar en un mismo espacio de nombres. Los espacios de nombres también <strong>evitan el problema de que surja una ambiegüedad en el caso de que haya dos componentes con un mismo nombre</strong>. Por ejemplo, podemos tener dentro de un programa varias clases con el nombre &#8220;Settings&#8221;, pero cada una estará referida a algo concreto. Incluyendo esas clases en distintos módulos, conseguimos que puedan ser identificadas de forma unívoca.</p>
<p>Para cargar y utilizar un módulo desde otras partes de la aplicación, podemos usar principalmente 3 métodos:</p>
<ul>
<li><strong><a href="http://ruby-doc.org/core/classes/Kernel.html#M001418" rel="external">require</a></strong>, que carga un fichero de código sólo una vez. En este caso el método recibe una cadena con el nombre del fichero.</li>
<li><strong><a href="http://ruby-doc.org/core/classes/Kernel.html#M001417" rel="external">load</a></strong>, que carga un fichero de código aunque ya ha sido ejecutado previamente.
<li>
<li><a href="http://ruby-doc.org/core/classes/Kernel.html#M001419" rel="external">autoload</a>, que recibe el nombre de un fichero y de un módulo, y carga el fichero la primera vez que se accede al módulo indicado.</a>
</ul>
<p>Todos estos métodos aceptan rutas absolutas y relativas.</p>
<h3>Mixins</h3>
<p>Los <em>mixins</em> permiten añadir funcionalidad a una clase mediante el comando <a href="http://ruby-doc.org/core/classes/Module.html#M000440" rel="external">include</a>.</p>
<p>Vamos a ver un ejemplo en el que añadimos un método de instancia a la clase String que elimina los espacios en blanco de principio y fin de una cadena y los sustituye por guiones.</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">module</span> StringUtils
  <span style="color:#9966CC; font-weight:bold;">def</span> hyphenize
    <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">to_s</span>.<span style="color:#9900CC;">strip</span>.<span style="color:#CC0066; font-weight:bold;">gsub</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">' '</span>, <span style="color:#996600;">'-'</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> <span style="color:#CC0066; font-weight:bold;">String</span>
  <span style="color:#9966CC; font-weight:bold;">include</span> StringUtils
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot; en un lugar de la mancha... &quot;</span>.<span style="color:#9900CC;">hyphenize</span></pre></div></div>

<p>Con este mecanismo, podemos reutilizar el módulo en varias clases. <strong>Es posible incluir varios módulos en una misma clase o módulo</strong>, con lo que conseguiríamos un efecto similar al de la herencia múltiple disponible en otros lenguajes como C++.</p>
<p><strong>Además de añadir métodos de instancia, es posible extender una clase con métodos de clase</strong>, haciendo uso de <a href="http://ruby-doc.org/core/classes/Object.html#M001002" rel="external">extend</a>. Lo vamos a ver con un último ejemplo, que extiende una clase con métodos de instancia y de clase.</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">module</span> MiModulo
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">included</span><span style="color:#006600; font-weight:bold;">&#40;</span>base<span style="color:#006600; font-weight:bold;">&#41;</span>
    base.<span style="color:#9900CC;">send</span> <span style="color:#ff3333; font-weight:bold;">:include</span>, InstanceMethods
    base.<span style="color:#9900CC;">send</span> <span style="color:#ff3333; font-weight:bold;">:extend</span>, ClassMethods
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">module</span> InstanceMethods
    <span style="color:#9966CC; font-weight:bold;">def</span> mi_metodo_de_instancia
      <span style="color:#996600;">&quot;mi método de instancia&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">module</span> ClassMethods<span style="color:#006600; font-weight:bold;">&lt;/</span>p<span style="color:#006600; font-weight:bold;">&gt;</span>
    <span style="color:#9966CC; font-weight:bold;">def</span> mi_metodo_de_clase
      <span style="color:#996600;">&quot;mi método de clase&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> MiClase
  <span style="color:#9966CC; font-weight:bold;">include</span> MiModulo
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#CC0066; font-weight:bold;">puts</span> MiClase.<span style="color:#9900CC;">mi_metodo_de_clase</span>
<span style="color:#CC0066; font-weight:bold;">puts</span> MiClase.<span style="color:#9900CC;">new</span>.<span style="color:#9900CC;">mi_metodo_de_instancia</span></pre></div></div>

<p>Como vemos, definiendo el método <a href="http://ruby-doc.org/core/classes/Module.html#M000458" rel="external">included</a> dentro de un módulo, podemos especificar un comportamiento que se ejecutará cuando ese módulo sea incluido en otro módulo o clase. En este caso, cuando se incluye el módulo en tiempo de ejecución, en envían dos mensaje con <a href="http://ruby-doc.org/core/classes/Object.html#M000999" rel="external">send</a> a MiClase para añadir los métodos de instancia(<em>include</em>) y de clase(<em>extend</em>).</p>
<p>Y con esta introducción y los ejemplillos, espero que entiendas un poco mejor cómo funcionan los módulos en Ruby <img src='http://alonsogarciapablo.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p>
<h2>Referencias</h2>
<p>Lógicamente, esto no lo he inventado yo, sino que he consultado estos enlaces:</p>
<ul>
<li><a href="http://ruby-doc.org/core/classes/Module.html" rel="external">Documentación de la clase <em>Module</em> de Ruby</a>.</li>
<li><a href="http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_modules.html" rel="external">Capítulo sobre módulos en Programming Ruby, The Pragmatic Programmer&#8217;s Guide</a>.</li>
<li><a href="http://www.rubyist.net/~slagell/ruby/modules.html" rel="external">Sección sobre módulos, Ruby User&#8217;s Guide</a>.</li>
<li><a href="http://en.wikipedia.org/wiki/Modular_programming" rel="external">Definición de programación modular, Wikipedia</a>.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://alonsogarciapablo.com/blog/modulos-en-ruby/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introducción rápida a Ruby Version Manager (RVM)</title>
		<link>http://alonsogarciapablo.com/blog/rvm-gestion-versiones-ruby/</link>
		<comments>http://alonsogarciapablo.com/blog/rvm-gestion-versiones-ruby/#comments</comments>
		<pubDate>Sun, 03 Apr 2011 18:50:12 +0000</pubDate>
		<dc:creator>Pablo</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://alonsogarciapablo.com/blog/?p=561</guid>
		<description><![CDATA[En esta entrada explico mis primeros pasos con Ruby Version Manager (RVM), una aplicación que nos permite gestionar fácilmente varias versiones de Ruby y agrupaciones de gemas. Mi intención es ir &#8220;migrando&#8221; poco a poco a la versión 1.9.2 de Ruby y a la versión 3 de Ruby On Rails y durante un tiempo voy [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://alonsogarciapablo.com/blog/wp-content/uploads/2011/04/tutorial_rvm.png" alt="Empezando con RVM" title="tutorial_rvm" width="230" height="220" class="aligncenter size-full wp-image-569" /></p>
<p>En esta entrada explico mis primeros pasos con <a rel="external" href="http://rvm.beginrescueend.com/">Ruby Version Manager (RVM)</a>, una aplicación que nos permite <strong>gestionar fácilmente varias versiones de Ruby y agrupaciones de gemas</strong>. Mi intención es ir &#8220;migrando&#8221; poco a poco a la versión 1.9.2 de Ruby y a la versión 3 de Ruby On Rails y durante un tiempo voy a tener que convivir con ambos entornos&#8230; De momento todo esto me ha funcionado bajo Mac OS X.</p>
<h3>Instalación</h3>
<p>Ejecutamos el siguiente comando:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">bash</span> <span style="color: #000000; font-weight: bold;">&lt;</span> <span style="color: #000000; font-weight: bold;">&lt;</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>curl <span style="color: #660033;">-s</span> https:<span style="color: #000000; font-weight: bold;">//</span>rvm.beginrescueend.com<span style="color: #000000; font-weight: bold;">/</span>install<span style="color: #000000; font-weight: bold;">/</span>rvm<span style="color: #7a0874; font-weight: bold;">&#41;</span></pre></div></div>

<p>Añadimos la siguiente línea al fichero de configuración <em>~/.bashrc</em>, teniendo en cuenta que no haya ningún &#8220;return&#8221; antes:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #660033;">-s</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$HOME</span>/.rvm/scripts/rvm&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #000000; font-weight: bold;">&amp;&amp;</span> <span style="color: #7a0874; font-weight: bold;">source</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$HOME</span>/.rvm/scripts/rvm&quot;</span>  <span style="color: #666666; font-style: italic;"># This loads RVM into a shell session.</span></pre></div></div>

<p>Si abrimos un nuevo shell y ejecutamos el comando <em>rvm</em>, deberíamos ver la descripción del comando y modo de uso. Ahora deberíamos instalar una versión de Ruby, por ejemplo la versión 1.9.2:</p>
<h3>Instalación de Ruby</h3>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">rvm <span style="color: #c20cb9; font-weight: bold;">install</span> 1.9.2</pre></div></div>

<p>Ahora ya podemos indicarle al sistema que use la versión de ruby de RVM:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">rvm use 1.9.2</pre></div></div>

<p>Si ejecutamos la orden:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">which</span> ruby</pre></div></div>

<p>Veremos que ya no apunta a <em>/usr/bin/ruby</em>, y si listamos las gemas instaladas veremos que ¡no hay ninguna!. Podríamos <strong>volver a la versión del sistema fácilmente</strong>, con:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">rvm system</pre></div></div>

<p>Si queremos seleccionar una versión por defecto para nuestro shell, podemos hacerlo con el flag &#8211;default:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">rvm <span style="color: #660033;">--default</span> use 1.9.2</pre></div></div>

<h3>Gemsets</h3>
<p>Ahora llega la parte interesante, la opción de <strong>crear <em>gemsets</em></strong>, que son agrupaciones de gemas. Por ejemplo, podríamos tener en un mismo sistema 2 <em>gemsets</em>, uno con las gemas de rails 2.3.8, y otro con las gemas que tienen que ver con la versión 3 de Rails. Al instalar una versión de Ruby, RVM crea por defecto el <em>gemset</em> de nombre &#8216;Global&#8217; y es el que se usa por defecto si no se lo indicamos explícitamente otro (como en el siguiente ejemplo). Para crear un <em>gemset</em> y empezar a usarlo:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">rvm gemset create rails3
rvm use 1.9.2<span style="color: #000000; font-weight: bold;">@</span>rails3</pre></div></div>

<p>Podemos ver los <em>gemsets</em> que hemos creados con:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">rvm gemset list</pre></div></div>

<p>Ahora ya podemos instalar la gema de Rails3 y todas las gemas que nos hagan falta. <strong>¡Anímate a probarlo!</strong> Es my sencillito. Y ahora&#8230; ¡a enredar un poco con Rails 3! <img src='http://alonsogarciapablo.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://alonsogarciapablo.com/blog/rvm-gestion-versiones-ruby/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Un ejemplo muy sencillo para entender el desarrollo dirigido por comportamiento (BDD) con Cucumber y Ruby On Rails</title>
		<link>http://alonsogarciapablo.com/blog/un-ejemplo-muy-sencillo-para-entender-el-desarrollo-dirigido-por-comportamiento-bdd-con-cucumber-y-ruby-on-rails/</link>
		<comments>http://alonsogarciapablo.com/blog/un-ejemplo-muy-sencillo-para-entender-el-desarrollo-dirigido-por-comportamiento-bdd-con-cucumber-y-ruby-on-rails/#comments</comments>
		<pubDate>Sun, 19 Dec 2010 22:28:50 +0000</pubDate>
		<dc:creator>Pablo</dc:creator>
				<category><![CDATA[Desarrollo web]]></category>
		<category><![CDATA[Metodologías ágiles]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[Cucumber]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[Ruby On Rails]]></category>

		<guid isPermaLink="false">http://alonsogarciapablo.com/blog/?p=303</guid>
		<description><![CDATA[El propósito de este post es ayudarte a configurar una aplicación Ruby On Rails muy sencilla, con soporte para la definición de tests de aceptación de usuario con Cucumber. Son los pasos que yo he seguido para iniciarme en el mundo del BDD (desarrollo dirigido por comportamientos). El ejemplo consiste en la clásica aplicación Rails [...]]]></description>
			<content:encoded><![CDATA[<p>
<img src="http://alonsogarciapablo.com/blog/wp-content/uploads/2010/12/cucumber_logo.png" alt="Logotipo de Cucumber. Pruebas de aceptación con Cucumber y Rails (BDD)" title="cucumber_logo" width="391" height="119" class="aligncenter size-full wp-image-320" /></p>
<p>El propósito de este post es ayudarte a <strong>configurar una aplicación <a href="http://www.rubyonrails.org/" rel="external">Ruby On Rails</a> muy sencilla, con soporte para la definición de tests de aceptación de usuario con <a href="http://cukes.info/" rel="external">Cucumber</a></strong>. Son los pasos que yo he seguido para iniciarme en el mundo del <a rel="external" href="http://en.wikipedia.org/wiki/Behavior_Driven_Development"><acronym title="Behavior Driven Development">BDD</acronym> (desarrollo dirigido por comportamientos)</a>. El ejemplo consiste en la clásica aplicación Rails (versión 2.3.5) de gestión de Posts, generada usando <a href="http://guides.rubyonrails.org/getting_started.html#getting-up-and-running-quickly-with-scaffolding" rel="external"><em>Scaffolding</em></a>.</p>
<p>He colgado la aplicación resultante en mi cuenta de GitHub: <a href="https://github.com/alonsogarciapablo/cucumber_rails_test" rel="external">https://github.com/alonsogarciapablo/cucumber_rails_test</a>.</p>
<p><span id="more-303"></span></p>
<h2>Configuración previa</h2>
<p>Antes de empezar, es necesario instalar las siguientes gemas:</p>
<h3>Gherkin</h3>
<p>Gherkin son dos cosas:</p>
<ul>
<li>El lenguaje que ha surgido a partir de Cucumber. Más concretamente es un <a rel="external" href="http://en.wikipedia.org/wiki/Domain-specific_language"><acronym title="Domain Specific Language">DSL</acronym> (lenguaje específico de dominio)</a> que permite hacer <a rel="external" href="http://en.wikipedia.org/wiki/Behavior_Driven_Development"><acronym title="Behavior Driven Development">BDD</acronym> (desarrollo dirigido por comportamiento)</a>.</li>
<li>La <a rel="external" href="https://github.com/aslakhellesoy/gherkin">librería</a> para parsear dicho lenguaje.</li>
</ul>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ gem <span style="color: #c20cb9; font-weight: bold;">install</span> gherkin</pre></div></div>

<h3>Cucumber y Cucumber para Rails</h3>
<p>Como introducción a Cucumber, te recomiendo leer <a href="https://github.com/aslakhellesoy/cucumber/wiki/Cucumber-Backgrounder" rel="external">Cucumber Backgrounder</a>, donde <a href="http://twitter.com/aslak_hellesoy" rel="external">Aslak Hellesøy</a> explica cómo se puede integrar Cucumber en una aplicación Rails, y la sintaxis para definir <em>Features</em>, <em>Scenarios</em> y <em>Steps</em>.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ gem <span style="color: #c20cb9; font-weight: bold;">install</span> cucumber-rails</pre></div></div>

<h3>Webrat</h3>
<p><a href="https://github.com/brynary/webrat/" rel="external">Webrat</a> permite escribir tests de aceptación que simulan el comportamiento de un navegador web y de los usuarios en definitiva. Permite simular cosas como: ve a la página principal, rellena el campo nombre de usuario con &#8220;Pablo&#8221;, rellena el campo contraseña con &#8220;Alonso&#8221;, pincha en el botón &#8220;Login&#8221;.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ gem <span style="color: #c20cb9; font-weight: bold;">install</span> webrat</pre></div></div>

<h3>Database Cleaner</h3>
<p><a href="https://github.com/bmabey/database_cleaner" rel="external">Database Cleaner</a> define una serie de estrategias para limpiar una base de datos. Originalmente se pensó para garantizar un estado &#8220;limpio&#8221; entre la ejecución de los tests automáticos.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ gem <span style="color: #c20cb9; font-weight: bold;">install</span> database_cleaner</pre></div></div>

<h2>Aplicación de prueba</h2>
<h3>Creamos una aplicación Rails y la configuramos para que funcione con Cucumber</h3>
<p>Creamos la aplicación Rails:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ rails cucumber_rails_test
$ <span style="color: #7a0874; font-weight: bold;">cd</span> cucumber_rails_test</pre></div></div>

<p>Generamos los ficheros necesarios para usar Cucumber con Webrat:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ script<span style="color: #000000; font-weight: bold;">/</span>generate cucumber <span style="color: #660033;">--webrat</span>
      create  config<span style="color: #000000; font-weight: bold;">/</span>cucumber.yml
      create  config<span style="color: #000000; font-weight: bold;">/</span>environments<span style="color: #000000; font-weight: bold;">/</span>cucumber.rb
      create  script<span style="color: #000000; font-weight: bold;">/</span>cucumber
      exists  features<span style="color: #000000; font-weight: bold;">/</span>step_definitions
      create  features<span style="color: #000000; font-weight: bold;">/</span>step_definitions<span style="color: #000000; font-weight: bold;">/</span>web_steps.rb
      create  features<span style="color: #000000; font-weight: bold;">/</span>support
      create  features<span style="color: #000000; font-weight: bold;">/</span>support<span style="color: #000000; font-weight: bold;">/</span>paths.rb
      create  features<span style="color: #000000; font-weight: bold;">/</span>support<span style="color: #000000; font-weight: bold;">/</span>env.rb
      create  lib<span style="color: #000000; font-weight: bold;">/</span>tasks
      create  lib<span style="color: #000000; font-weight: bold;">/</span>tasks<span style="color: #000000; font-weight: bold;">/</span>cucumber.rake</pre></div></div>

<h3>Generamos una <em>Feature</em></h3>
<p>Generamos una <em>feature</em> con dos escenarios, uno para la creación y otro para el borrado de Posts:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ script<span style="color: #000000; font-weight: bold;">/</span>generate feature post title:string body:text published:boolean
      exists  features<span style="color: #000000; font-weight: bold;">/</span>step_definitions
      create  features<span style="color: #000000; font-weight: bold;">/</span>manage_posts.feature
      create  features<span style="color: #000000; font-weight: bold;">/</span>step_definitions<span style="color: #000000; font-weight: bold;">/</span>post_steps.rb</pre></div></div>

<p>Se deben haber creado automáticamente dos nuevos ficheros, un fichero con la definición de la funcionalidad de Gestión de posts (<strong>features/manage_posts.feature</strong>):</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">Feature: Manage posts
  <span style="color:#9966CC; font-weight:bold;">In</span> order to <span style="color:#006600; font-weight:bold;">&#91;</span>goal<span style="color:#006600; font-weight:bold;">&#93;</span>
  <span style="color:#006600; font-weight:bold;">&#91;</span>stakeholder<span style="color:#006600; font-weight:bold;">&#93;</span>
  wants <span style="color:#006600; font-weight:bold;">&#91;</span>behaviour<span style="color:#006600; font-weight:bold;">&#93;</span>
&nbsp;
  Scenario: Register new post
    Given I am on the new post page
    <span style="color:#9966CC; font-weight:bold;">When</span> I fill <span style="color:#9966CC; font-weight:bold;">in</span> <span style="color:#996600;">&quot;Title&quot;</span> with <span style="color:#996600;">&quot;title 1&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">And</span> I fill <span style="color:#9966CC; font-weight:bold;">in</span> <span style="color:#996600;">&quot;Body&quot;</span> with <span style="color:#996600;">&quot;body 1&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">And</span> I uncheck <span style="color:#996600;">&quot;Published&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">And</span> I press <span style="color:#996600;">&quot;Create&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">Then</span> I should see <span style="color:#996600;">&quot;title 1&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">And</span> I should see <span style="color:#996600;">&quot;body 1&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">And</span> I should see <span style="color:#996600;">&quot;false&quot;</span>
&nbsp;
  Scenario: Delete post
    Given the following posts:
      <span style="color:#006600; font-weight:bold;">|</span>title<span style="color:#006600; font-weight:bold;">|</span>body<span style="color:#006600; font-weight:bold;">|</span>published<span style="color:#006600; font-weight:bold;">|</span>
      <span style="color:#006600; font-weight:bold;">|</span>title <span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">|</span>body <span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">|</span>false<span style="color:#006600; font-weight:bold;">|</span>
      <span style="color:#006600; font-weight:bold;">|</span>title <span style="color:#006666;">2</span><span style="color:#006600; font-weight:bold;">|</span>body <span style="color:#006666;">2</span><span style="color:#006600; font-weight:bold;">|</span>true<span style="color:#006600; font-weight:bold;">|</span>
      <span style="color:#006600; font-weight:bold;">|</span>title <span style="color:#006666;">3</span><span style="color:#006600; font-weight:bold;">|</span>body <span style="color:#006666;">3</span><span style="color:#006600; font-weight:bold;">|</span>false<span style="color:#006600; font-weight:bold;">|</span>
      <span style="color:#006600; font-weight:bold;">|</span>title <span style="color:#006666;">4</span><span style="color:#006600; font-weight:bold;">|</span>body <span style="color:#006666;">4</span><span style="color:#006600; font-weight:bold;">|</span>true<span style="color:#006600; font-weight:bold;">|</span>
    <span style="color:#9966CC; font-weight:bold;">When</span> I delete the 3rd post
    <span style="color:#9966CC; font-weight:bold;">Then</span> I should see the following posts:
      <span style="color:#006600; font-weight:bold;">|</span>Title<span style="color:#006600; font-weight:bold;">|</span>Body<span style="color:#006600; font-weight:bold;">|</span>Published<span style="color:#006600; font-weight:bold;">|</span>
      <span style="color:#006600; font-weight:bold;">|</span>title <span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">|</span>body <span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">|</span>false<span style="color:#006600; font-weight:bold;">|</span>
      <span style="color:#006600; font-weight:bold;">|</span>title <span style="color:#006666;">2</span><span style="color:#006600; font-weight:bold;">|</span>body <span style="color:#006666;">2</span><span style="color:#006600; font-weight:bold;">|</span>true<span style="color:#006600; font-weight:bold;">|</span>
      <span style="color:#006600; font-weight:bold;">|</span>title <span style="color:#006666;">4</span><span style="color:#006600; font-weight:bold;">|</span>body <span style="color:#006666;">4</span><span style="color:#006600; font-weight:bold;">|</span>true<span style="color:#006600; font-weight:bold;">|</span></pre></div></div>

<p>, y otro fichero con la definición de los pasos (<strong>features/step_definitions/post_steps.rb</strong>):</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">Given <span style="color:#006600; font-weight:bold;">/</span>^the following posts:$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>posts<span style="color:#006600; font-weight:bold;">|</span>
  Post.<span style="color:#9900CC;">create</span>!<span style="color:#006600; font-weight:bold;">&#40;</span>posts.<span style="color:#9900CC;">hashes</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">When</span> <span style="color:#006600; font-weight:bold;">/</span>^I delete the <span style="color:#006600; font-weight:bold;">&#40;</span>\d<span style="color:#006600; font-weight:bold;">+</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#40;</span>?:st<span style="color:#006600; font-weight:bold;">|</span>nd<span style="color:#006600; font-weight:bold;">|</span>rd<span style="color:#006600; font-weight:bold;">|</span>th<span style="color:#006600; font-weight:bold;">&#41;</span> post$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>pos<span style="color:#006600; font-weight:bold;">|</span>
  visit posts_path
  within<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;table tr:nth-child(#{pos.to_i+1})&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
    click_link <span style="color:#996600;">&quot;Destroy&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">Then</span> <span style="color:#006600; font-weight:bold;">/</span>^I should see the following posts:$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>expected_posts_table<span style="color:#006600; font-weight:bold;">|</span>
  expected_posts_table.<span style="color:#9900CC;">diff</span>!<span style="color:#006600; font-weight:bold;">&#40;</span>tableish<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">'table tr'</span>, <span style="color:#996600;">'td,th'</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<h3>Ejecutamos los tests de aceptación</h3>
<p>Como todavía no está implementada la funcionalidad, la ejecución de los dos escenarios falla. No existe todavía el modelo <em>Post</em>, ni la ruta asociada a la creación de un nuevo Post:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ rake cucumber
<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>paul<span style="color: #000000; font-weight: bold;">/</span>Proyectos<span style="color: #000000; font-weight: bold;">/</span>cucumber_rails_test<span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">/</span>System<span style="color: #000000; font-weight: bold;">/</span>Library<span style="color: #000000; font-weight: bold;">/</span>Frameworks<span style="color: #000000; font-weight: bold;">/</span>Ruby.framework<span style="color: #000000; font-weight: bold;">/</span>Versions<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">1.8</span><span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>ruby <span style="color: #660033;">-I</span> <span style="color: #ff0000;">&quot;/Users/paul/.gem/ruby/1.8/gems/cucumber-0.10.0/lib:lib&quot;</span> <span style="color: #ff0000;">&quot;/Users/paul/.gem/ruby/1.8/gems/cucumber-0.10.0/bin/cucumber&quot;</span>  <span style="color: #660033;">--profile</span> default
Using the default profile...
F-------F--
&nbsp;
<span style="color: #7a0874; font-weight: bold;">&#40;</span>::<span style="color: #7a0874; font-weight: bold;">&#41;</span> failed steps <span style="color: #7a0874; font-weight: bold;">&#40;</span>::<span style="color: #7a0874; font-weight: bold;">&#41;</span>
&nbsp;
undefined <span style="color: #7a0874; font-weight: bold;">local</span> variable or method <span style="color: #000000; font-weight: bold;">`</span>new_post_path<span style="color: #ff0000;">' for #&lt;Cucumber::Rails::World:0x8194fd00&gt; (NameError)
./features/support/paths.rb:14:in `path_to'</span>
.<span style="color: #000000; font-weight: bold;">/</span>features<span style="color: #000000; font-weight: bold;">/</span>step_definitions<span style="color: #000000; font-weight: bold;">/</span>web_steps.rb:<span style="color: #000000;">16</span>:<span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">`/</span>^<span style="color: #7a0874; font-weight: bold;">&#40;</span>?:<span style="color: #000000; font-weight: bold;">|</span>I <span style="color: #7a0874; font-weight: bold;">&#41;</span>am on <span style="color: #7a0874; font-weight: bold;">&#40;</span>.+<span style="color: #7a0874; font-weight: bold;">&#41;</span>$<span style="color: #000000; font-weight: bold;">/</span><span style="color: #ff0000;">'
features/manage_posts.feature:7:in `Given I am on the new post page'</span>
&nbsp;
uninitialized constant Post <span style="color: #7a0874; font-weight: bold;">&#40;</span>NameError<span style="color: #7a0874; font-weight: bold;">&#41;</span>
.<span style="color: #000000; font-weight: bold;">/</span>features<span style="color: #000000; font-weight: bold;">/</span>step_definitions<span style="color: #000000; font-weight: bold;">/</span>post_steps.rb:<span style="color: #000000;">2</span>:<span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">`/</span>^the following posts:$<span style="color: #000000; font-weight: bold;">/</span><span style="color: #ff0000;">'
features/manage_posts.feature:17:in `Given the following posts:'</span>
&nbsp;
Failing Scenarios:
cucumber features<span style="color: #000000; font-weight: bold;">/</span>manage_posts.feature:<span style="color: #000000;">6</span> <span style="color: #666666; font-style: italic;"># Scenario: Register new post</span>
cucumber features<span style="color: #000000; font-weight: bold;">/</span>manage_posts.feature:<span style="color: #000000;">16</span> <span style="color: #666666; font-style: italic;"># Scenario: Delete post</span>
&nbsp;
<span style="color: #000000;">2</span> scenarios <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">2</span> failed<span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000;">11</span> steps <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">2</span> failed, <span style="color: #000000;">9</span> skipped<span style="color: #7a0874; font-weight: bold;">&#41;</span>
0m0.124s
rake aborted<span style="color: #000000; font-weight: bold;">!</span></pre></div></div>

<h3>Generamos el <em>scaffold</em> del modelo Post y ejecutamos las migraciones pendientes</h3>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ script<span style="color: #000000; font-weight: bold;">/</span>generate scaffold post title:string body:text published:boolean
$ rake db:migrate</pre></div></div>

<h3>Volvemos a lanzar las pruebas</h3>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ rake cucumber
<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>paul<span style="color: #000000; font-weight: bold;">/</span>Proyectos<span style="color: #000000; font-weight: bold;">/</span>cucumber_rails_test<span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">/</span>System<span style="color: #000000; font-weight: bold;">/</span>Library<span style="color: #000000; font-weight: bold;">/</span>Frameworks<span style="color: #000000; font-weight: bold;">/</span>Ruby.framework<span style="color: #000000; font-weight: bold;">/</span>Versions<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">1.8</span><span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>ruby <span style="color: #660033;">-I</span> <span style="color: #ff0000;">&quot;/Users/paul/.gem/ruby/1.8/gems/cucumber-0.10.0/lib:lib&quot;</span> <span style="color: #ff0000;">&quot;/Users/paul/.gem/ruby/1.8/gems/cucumber-0.10.0/bin/cucumber&quot;</span>  <span style="color: #660033;">--profile</span> default
Using the default profile...
...........
&nbsp;
<span style="color: #000000;">2</span> scenarios <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">2</span> passed<span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000;">11</span> steps <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">11</span> passed<span style="color: #7a0874; font-weight: bold;">&#41;</span>
0m0.261s</pre></div></div>

<p>Ahora sí que <strong>funcionan los tests y nuestra aplicación ya tiene una cobertura muy básica de tests de aceptación</strong> para la funcionalidad de gestión de posts, y los escenarios de creación y borrado. Ya tenemos listo nuestro <strong>entorno para empezar a desarrollar <a href="http://blog.dannorth.net/introducing-bdd/" rel="external">the-bdd-way</a></strong> <img src='http://alonsogarciapablo.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  ¿A que no era tan difícil?</p>
]]></content:encoded>
			<wfw:commentRss>http://alonsogarciapablo.com/blog/un-ejemplo-muy-sencillo-para-entender-el-desarrollo-dirigido-por-comportamiento-bdd-con-cucumber-y-ruby-on-rails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

