Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 这个Rspec语法到底要求什么?_Ruby_Rspec_Rspec Rails - Fatal编程技术网

Ruby 这个Rspec语法到底要求什么?

Ruby 这个Rspec语法到底要求什么?,ruby,rspec,rspec-rails,Ruby,Rspec,Rspec Rails,TL;我博士明年将参加一个训练营,他们的评估之一是学习ruby。我有JS背景,对ruby非常陌生。我有这个评估,在这种情况下,我不熟悉测试想要我做什么。下面是测试用例(Rspec),下面是我的答案 describe "some silly block functions" do describe "reverser" do it "reverses the string returned by the default block" do result = reverser

TL;我博士明年将参加一个训练营,他们的评估之一是学习ruby。我有JS背景,对ruby非常陌生。我有这个评估,在这种情况下,我不熟悉测试想要我做什么。下面是测试用例(Rspec),下面是我的答案

describe "some silly block functions" do
  describe "reverser" do
    it "reverses the string returned by the default block" do
      result = reverser do
        "hello"
      end

  expect(result).to eq("olleh")
end

it "reverses each word in the string returned by the default block" do
  result = reverser do
    "hello dolly"
  end

  expect(result).to eq("olleh yllod")
  end
end
这是我的回答代码:

def reverser sentence
  words = sentence.split(" ")
  result = []

  words.length.times do |i|
    result.push(yield(words[i]))
  end

  result.join(" ")
end

reverser("hello dolly") {|n| n.reverse} #=> 'olleh yllod'
正如我前面提到的,我对ruby是新手,屈服的想法就像JS的回调函数。我很难弄清楚测试用例希望我写什么样的预期代码。它说“它反转默认块返回的字符串中的每个单词”,我刚刚在函数外创建了一个块,在该块中单词被反转。我感谢任何能提供建议的人的帮助和指导

yield
表示“在块内执行代码并给出结果”。您的
reverser
方法可以这样简单地编写:

def reverser
  yield.split.map(&:reverse).join(' ') if block_given?
end

result = reverser do
  'hello world'
end

puts result
# => olleh dlrow
Ruby自动返回最后一个被称为返回值的东西,因此给
reverser
的块的返回值是
hello world
,它将被分配给
yield

您可以查看文档中是否有
给定的块?
。查看块的更深入解释

yield
表示“在块内执行代码并给出结果”。您的
reverser
方法可以这样简单地编写:

def reverser
  yield.split.map(&:reverse).join(' ') if block_given?
end

result = reverser do
  'hello world'
end

puts result
# => olleh dlrow
Ruby自动返回最后一个被称为返回值的东西,因此给
reverser
的块的返回值是
hello world
,它将被分配给
yield


您可以查看文档中是否有
给定的块?
。请看一看关于blocks的更深入的解释

如果你要参加训练营,我认为问题的重点应该是解释RSpec和TDD。我认为在这种情况下,给你这个问题的答案只是你需要知道的一部分。所以

TDD的原则之一是编写最少的代码以使测试通过。如果我回到起点

您已经编写了一个
反向器
方法,该方法将
语句
作为参数:

def reverser sentence
  'olleh'
end
运行测试时,测试应失败并出现错误:
参数数量错误
。请删除参数并重试,然后再次运行RSpec:

def reverser
  'olleh'
end
第一个测试应该通过,但第二个测试将失败,因为我们已经对
olleh
的返回值进行了硬编码。显然,返回硬编码的值是没有用的——它只是帮助测试通过了——所以我需要弄清楚如何
产生
返回值

def reverser
  yield.reverse
end
这也许会让第二次测试通过

这是TDD的指导原则,采取一些小步骤,让代码通过。一旦它通过了,就回去重构并改进代码

正如您可能已经知道的,TDD对于编写高质量的代码是非常宝贵的—它使编写代码变得有趣,有助于重构


我找到了一个页面,上面有一些,我想推荐codeschool,但他们已经取消了课程,这很遗憾,但有一个可能有用,还有一个可能也有用,可以让你领先。

如果你要参加训练营,我想问题的重点应该是解释RSpec和TDD。我认为在这种情况下,给你这个问题的答案只是你需要知道的一部分。所以

TDD的原则之一是编写最少的代码以使测试通过。如果我回到起点

您已经编写了一个
反向器
方法,该方法将
语句
作为参数:

def reverser sentence
  'olleh'
end
运行测试时,测试应失败并出现错误:
参数数量错误
。请删除参数并重试,然后再次运行RSpec:

def reverser
  'olleh'
end
第一个测试应该通过,但第二个测试将失败,因为我们已经对
olleh
的返回值进行了硬编码。显然,返回硬编码的值是没有用的——它只是帮助测试通过了——所以我需要弄清楚如何
产生
返回值

def reverser
  yield.reverse
end
这也许会让第二次测试通过

这是TDD的指导原则,采取一些小步骤,让代码通过。一旦它通过了,就回去重构并改进代码

正如您可能已经知道的,TDD对于编写高质量的代码是非常宝贵的—它使编写代码变得有趣,有助于重构


我找到了一个页面,上面有一些,我想推荐codeschool,但他们已经取消了他们的课程,这很遗憾,但有一个可能会有用,还有一个可能也会有用,可以让你领先。

这实际上更多的是关于TDD,而不是关于Ruby。这种方法在任何其他语言中都是一样的

TDD的要点是编写可能失败的最简单测试,然后编写可能更改错误消息的最简单代码。在本例中,步骤1已经提供给您,因此这实际上是关于步骤2:编写可能更改消息的最简单代码

让我们运行测试!消息说:

最简单的代码是什么,它可能会改变一条表示方法不存在的消息?当然,让这个方法存在吧

def reverser; end
现在,信息是:

好的,它希望我们返回字符串
'olleh'
,但实际上我们返回了
nil
。这很简单:

def reverser; 'olleh' end
太好了!第一次测试通过了。但第二种方法仍然失败。它说:

嗯…显然,仅仅静态地返回一些东西是不够的。我们每次都必须返回不同的内容。显而易见的来源是一个参数,但我们的方法没有任何参数。还是这样?对在Ruby中,所有方法都有一个隐式块参数!您可以使用
yield
关键字对其进行评估,因此让我们尝试一下:

def reverser; yield end
该死!我们是bac
def reverser; yield.reverse end
expected: "olleh yllod"
     got: "yllod olleh"
def reverser; yield.reverse.split.reverse.join end
expected: "olleh yllod"
     got: "ollehyllod"
def reverser; yield.reverse.split.reverse.join(' ') end
2 examples, 0 failures