Ruby和RSpec的介绍…

预备课程的第三周非常具有挑战性和趣味性。 这是我第一次使用Ruby和Rspec测试,我发现提高编程效率非常有用。 好吧,在展示我的工作之前,我将简要介绍Ruby和Rspec。

Ruby是一种动态的开源编程语言,其重点是简单性和生产力。 它具有优雅的语法,易于阅读且易于编写。 另一方面, Rspec是用于Ruby编程语言的单元测试框架。 它确实是一种行为驱动的开发工具,因为测试重点在于应用程序的“行为”,而不是其工作方式。 它强调应用程序的行为方式,而不是工作方式。

以下是一些有用的Rspec关键字:

  1. describe关键字 -用于定义“示例组”。 您可以将“示例组”视为测试的集合。
  2. it关键字 —用于定义“示例”。 一个例子基本上是一个测试或一个测试案例。
  3. Expect关键字Expect关键字用于在RSpec中定义“期望”。 这是一个验证步骤,我们在其中检查是否满足特定的预期条件。

模拟Fizzbuzz游戏

Fizzbuzz是一个小组文字游戏,儿童可以教他们有关分裂的知识。 对于孩子们来说,这是一个不错的游戏,它将帮助他们熟悉部门划分。 规则是如此简单,但是迫使玩家以几种不同的方式快速分析数字。

规则:

  • 如果该数字可被3整除,那么该人不会说这个数字,而是说“嘶嘶!”
  • 另外,如果数字中包含5,则玩家必须说“嗡嗡!”
  • 同样,如果数字可以被3和5 a整除,则必须说“ FizzBu​​zz!”
  • 这些嘶嘶声和嗡嗡声结合在一起,例如,代替35 ,我会说“嘶嘶声,嘶嘶声,嗡嗡声!” ,因为该数字包含5,可以除以5,然后可以除以7。

Fizzbuzz游戏是用不同的编程语言编写的,因为它对于初学者来说是一个很好的练习。 显然,我们将创建一个使用Ruby和Rspec来模拟fizzbuzz游戏的程序。

编写一个测试和程序,打印从1到100的数字。但是,对于三个打印数字“ Fizz”(而不是数字)的倍数,以及五个打印“嗡嗡声”的倍数。 对于三和五的倍数的数字,请打印“ FizzBu​​zz”。

现在,让我们开始吧!

  1. 首先创建一个新目录: fizzbuzz

2.打开fizzbuzz目录并创建Gemfile

3.打开Gemfile并将rspec添加为依赖项:

4.现在,我们必须通过输入$ gem install bundler来安装gem。

5.然后在终端中运行bundle install

6.现在,通过在命令行中输入$ rspec --init来初始化RSpec

7.打开.rspec文件( 这是一个隐藏文件 ),然后更改其内容以以详细格式显示测试结果。

 # .rspec 

--format documentation
--color
--require spec_helper

8.要检查您是否处在正确的轨道上,请返回到终端并运行rspec命令,并检查是否具有与下图相同的输出。

基本上,如果您获得相同的输出,则意味着您已设置RSpec并准备编写您的第一个测试。

使用Fizzbuzz进行首次测试

  1. 首先,我们需要创建一个测试文件 。 您必须记住,我们所有的规格都将存在于spec文件夹中。 现在,创建一个文件并将其命名为: fizz_buzz_spec.rb

然后,在编辑器中将其打开并添加以下代码:

  require './lib/fizz_buzz' #w 查找并测试源文件 
fizz_buzz.rb 文件夹,名为 fizz_buzz.rb
 describe 'fizz_buzz' do 
 end 

不幸的是,由于我们尚未创建该文件,因此目前无法找到该文件。 因此,我们的测试将给我们一个错误。

好吧,不要担心一堆错误,只关注前两行,因为这是最重要的几行,在这种情况下,我们有:

当我们遇到错误时,RSpec通常会返回很多文本,并且可能会令人生畏。 一个技巧是始终查看输出的顶部。 这就是重要信息所在的地方。

由于RSpec告诉我们, lib文件夹中没有名为fizz_buzz.rb文件。 由于我们没有它,所以让我们创建一个。

 $ mkdir lib 
$ touch lib/fizz_buzz.rb

现在,让我们检查您到目前为止创建的内容。 在这一点上,我们必须就三件事达成共识,这一点很重要。

  1. 您的测试/规格位于spec文件夹中
  2. 您的实现(或生产)文件位于lib文件夹中
  3. 您的设置 (例如Gemfile等)位于主项目文件夹中

让我们做出一些决定。 假设我们要在程序中使用一个主方法,该方法可以取一个数字,如果不满足条件,则返回“ fizz”,“ buzz”,“ fizzbuzz”或数字。 那是我们的目标,对不对?

将以下it块添加到测试文件中(确保将其放在 describe块内)

 # spec/fizz_buzz_spec.rb 
 it 'returns 1 if number is 1' do 
expect(fizz_buzz(1)).to eq 1
end

返回您的终端并运行RSpec。 您将得到一个错误:

同样,很多文本,但是如果您仔细阅读消息,将会看到我们收到了NoMethodError 这意味着我们的测试找不到名为fizz_buzz的方法。 同样,我们还没有创建它-这就是我们所期望的。

即使我们知道测试将失败,我们仍然想运行它并查看预期的错误。 这样,我们将有信心继续前进。 如果我们得到了错误的错误,那么其他东西就坏了。

让我们编写最少的代码以使此测试通过:

 # lib/fizz_buzz.rb 
 def fizz_buzz(number) 
number
end

这个非常简单的方法将数字作为参数,然后简单地返回它。 在Ruby中,方法返回其最后一行。 他们输出最后一件事。 在这里,我们的方法将return我们的number

它可以通过测试-尝试再次在终端中运行rspec命令。

因此,如果我们传入“ 1”,我们要求程序返回“ 1”。 完全符合游戏规则吧? 我们已经编写了实现该目标所需的最少代码量。 在这个阶段,我们都很好。

但是我们还远远没有完成,对吗? 目标之一是如果传入的数字可被3整除,则返回单词fizz 。让我们为此做一个测试。

 # spec/fizz_buzz_spec.rb 
 it "returns 'fizz' if number is divisible by 3" do 
expect(fizz_buzz(3)).to eq 'fizz'
end

如果再次运行rspec ,将会收到错误消息(当然)

假设我们希望我们的实现具有一些方法来检查数字是否可以被3、5和15整除。

让我们利用流控制。 我们希望我们的程序只有在number可以被3整除的情况下才能走出“嘶嘶”的道路。

 # lib/fizz_buzz.rb 
 def fizz_buzz(number) 
if number % 3 == 0
'fizz'
end
end

如果模数(%)仍不清楚,请尝试观看此YouTube视频,以视觉方式对其进行说明。 模量是一个重要的操作员,尽管令人困惑,但却难以理解。

请记住,我们总是可以打开irb并进行游戏。 您可以复制上面的方法,看看有哪些不同的数字会使您fizz 。 您会注意到,只有被3除以的数字才会返回’ fizz_buzz(3)等。您必须编写fizz_buzz(3)fizz_buzz(9)才能看到fizz 。 尝试只编写fizz_buzz 。 为什么会出现该错误?

现在,此代码将使我们的第二个测试通过。 尝试一下。

由于要求我们继续测试,因此我提出了具有不同算法的实现方法,这些方法显示了fizzbuzz游戏的模拟:

第一种实现方法,本课的继续:

我的测试文件:

我的实现方法1:

在rspec中的结果:

irb中的测试:

测试文件2:

在这里,我放置了更多的测试块来测试实现方法。

我的实现方法2:

样品运行:

额外信贷:悲伤之路

到目前为止,我们写的被称为“快乐之路”。 这是我们期望“正常”用户采取的行动。 “普通”用户输入3或12或13987。

但是,如果用户输入“恐龙”怎么办?

解:

循环将检查直到用户输入为整数(Fixnum)

样品运行:

该程序将要求用户输入数字,如果他们输入字符串,例如“ dinosaur”。

参考文献:

| 工艺学院
©手工艺学院。 保留所有权利,除非另有说明。 EdX,Open edX以及edX和Open EdX徽标已注册…… class.craftacademy.se Ruby编程语言
一种动态,开源的编程语言,着重于简单性和生产力。 它具有一种优雅的语法,可以… www.ruby-lang.org RSpec教程
RSpec初学者教程–通过以下简单,容易的步骤学习RSpec,从基本概念到高级概念,包括: 嘶嘶声
我在小学时喜欢这个游戏。 这是一款很棒的儿童数学游戏,尤其是对于那些需要时间表帮助的人。 该… www.dr-mikes-math-games-for-kids.com