2013-05-01 56 views
1

以下是来自Test-First.org的练习#5(愚蠢块)的一部分,我尝试在学习时尝试破解我自己,准备一个Ruby类。初学者RSpec:需要帮助编写Ruby代码来通过RSpec测试(傻瓜块练习)

每个练习都附带一个RSpec'_spec.rb'文件,用户需要编写相应的Ruby代码'.rb'文件,并继续“耙”它直到所有RSpec测试(示例)都是满意。至少这是我的解释,并且我已经能够完成前四个练习,但是,本练习中的RSpec语法让我难以置信。 (不幸的是,我不仅仅是编程方面的新手,我对RSpes来说绝对是新手,我还没有能够在线找到一个很好的新手级RSpec/TDD介绍)。

因此,我希望RSpec专家可能会提供帮助。基本上,我想知道下面的RSpec语法告诉我写代码的究竟是什么?

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 
... 

我认为我写了一个叫做“反向”,它接受一个字符串参数的方法,并返回刺痛逆转,如:

def reverser(string) 
    return string.reverse 
end 

唉,这显然是不正确的 - 耙悲惨的失败了:

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 <top (r 
equired)>' 

我怀疑它是与传递“默认代码块”,但我不知道如何结构。在这个练习中有更多的写法,但是,如果我能够弄清楚最初的一个,我想我可以解决其余的问题!

非常感谢Danke sehr,Muchas gracias !! :)

回答

5

据我所知,由于此方法需要一个块并对其执行某些操作,因此您需要定义采用块的方法而不是参数。因此,为了使该方法做到这一点:

reverser do 
    "hello" 
end 

你会写是这样的:

def reverser 
    yield.reverse 
end 

或:

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

现在,当块通过上述方法将工作它:reverser { "hello" },但不使用参数时:reverser("hello")

+2

好答案;我会补充说,除非你只是简单地调用它,否则你应该更喜欢第一个版本(带'yield')。 – 2013-05-01 13:28:46

+0

感谢您的澄清。 – 2013-05-01 13:47:22

+0

@ mind.blank:谢谢,就是这样! RSpec文件进行测试,所以在我的情况下,我实际上并不需要调用该方法。找到一个RSpec介绍截屏,会给它一个旋风。 – pete 2013-05-01 20:14:45