Principiante RSpec: necesita ayuda para escribir el código Ruby para pasar las pruebas RSpec (ejercicio de Silly Blocks)

La siguiente es una sección del ejercicio # 5 (Bloques tontos) de Test-First.org que estoy tratando de descifrar mientras aprendo por mi cuenta, en preparación para una clase de Ruby.

Cada ejercicio viene con un archivo RSpec ‘_spec.rb’ y se espera que el usuario escriba el archivo correspondiente del código Ruby ‘.rb’, y continúe “rastrilándolo” hasta que todas las pruebas RSpec (ejemplos) estén satisfechas. Al menos esa es mi interpretación y he podido superar los primeros cuatro ejercicios, sin embargo, la syntax de RSpec en este ejercicio me ha dejado perplejo. (Desafortunadamente, no solo soy bastante nuevo en encoding, definitivamente soy muy nuevo en RSpes y no he podido encontrar una buena introducción para principiantes de RSpec / TDD en línea).

Por lo tanto, espero que un experto residente en RSpec pueda ayudar. Básicamente, me gustaría saber qué es exactamente la siguiente syntax de RSpec que me dice que escriba para el código.

require "silly_blocks" describe "some silly block functions" do describe "reverser" do it "reverses the string returned by the default block" do result = reverser do "hello" end result.should == "olleh" end ... 

Asumí que debo escribir un método llamado ‘inversor’ que acepta un argumento de cadena y devuelve la secuencia invertida, como por ejemplo:

 def reverser(string) return string.reverse end 

Lamentablemente, eso es claramente incorrecto: el rastrillo falla miserablemente:

 some silly block functions reverser reverses the string returned by the default block (FAILED - 1) Failures: 1) some silly block functions reverser reverses the string returned by the def ault block Failure/Error: result = reverser do ArgumentError: wrong number of arguments (0 for 1) # ./05_silly_blocks/silly_blocks.rb:3:in `reverser' # ./05_silly_blocks/silly_blocks_spec.rb:15:in `block (3 levels) in ' 

Sospecho que tiene algo que ver con pasar “bloques de código predeterminados” pero no estoy seguro de cómo estructurar eso. Hay muchos más métodos para escribir en este ejercicio, sin embargo, si puedo aclarar el inicial, ¡creo que puedo resolver el rest!

Mayor gracias, Danke sehr, Muchas gracias !! 🙂

Por lo que sé, como este método toma un bloque y hace algo con él, debe definir el método para tomar un bloque, en lugar de un argumento. Entonces para habilitar el método para hacer esto:

 reverser do "hello" end 

Lo escribirías algo así como:

 def reverser yield.reverse end 

o:

 def reverser(&block) block.call.reverse end 

Ahora los métodos anteriores funcionarán cuando se le pase un bloque: reverser { "hello" } , pero no cuando se usa un argumento: reverser("hello") .