Day 7 从阅读错误到通过测试!

该文章同步发布於:我的部落格

昨天我们的测试竟然没有通过...

到底发生了什麽?该怎麽让它通过?那串红红的字看起来就很不顺眼,我们该怎麽做呢?放心!今天就会让你感受的绿灯的疗癒~

阅读错误到通过测试

我们来看看他说我们错误的地方在哪,首先是这串:

Failure/Error: burger = Burger.new('Big mac')

但好像没有告诉我们错在哪里耶?喔喔!我们再往下看

NameError:
  uninitialized constant Burger

他的意思是我们并没有初始化一个常数 Burger

这就是 Ruby 或是 写 Rails 时超级常见的错误,请笔记!

我们需要拥有一个类别,然後呼叫 initialize 这个方法,这样我们才可以生出 burger 这个物件!

我们要写在哪里呢?其实可以直接写在测试的上面,但这并不是一个好方法,我们在写测试的时候会希望把每只档案分开的放置,这样才是看起来专业的方法!

现在这是我们的档案结构,这样也很明显地可以理解到,burger_spec.rb 就是拿来测试 burger.rb 这支档案的!

接着我们在 burger.rb 中写入:

class Burger

end

再输入一次 rspec spec/burger_spec.rb,看看错误的讯息是什麽?

虽然还是错误的还是同一行,但错误的内容已经不一样了,我们继续来解决这个问题,他说我的给予的参数是错误的,代表说我们需要在类别初始化的时候加入参数,来让这个错误讯息通过,实作吧!

class Burger 

  def initialize(type)
    @type = type
  end
end

好的,我们一样在执行一次 rspec spec/burger_spec.rb

通常看到错误讯息有所改变的时候,都会觉得松一口气的感觉,至少事情产生变化了~

因为我们又更近了一步了!代表每一次的改动都有正中红心,也有根据错误讯息来做正确的改动!

这次的错误也是很常见的 NoMethodError 意指我们没有 type 这个方法,如果是别的语言来的人可能会觉得很奇怪,取得属性还要什麽方法?

事实上在 Ruby 的世界里都是物件,而取值也会是物件的其中一个方法,包括设置值也是喔!

class Burger 

  def initialize(type)
    @type = type
  end
  
  def type # 这个是取值的方法
    @type
  end
  
  def type=(type) # 这个是赋值的方法
    @type = type
  end
end

来看看我们把取值的方法加上去之後会发生什麽事情吧?

登愣登愣!!成功啦!我们通过这次的测试了!

但别高兴得太早,还记得 TDD 测试中通过绿色後要进行的环节吗?

没错,就是重构的部分,这也是非常重要的!

我们这时候回头看一下我们“测试码”以及“真实程序码”有没有什麽需要改进的地方。

测试的部分因为只有两行,好像没什麽可以缩减的部分了,我们就看看“真实程序码”吧!

关於取值、赋值两个方法,Ruby 其实有提供我们更便捷的方式来用,不需要这样子写到六行,让我们来重构看看这段程序码吧!


class Burger 
  attr_accessor :type
  
  def initialize(type)
    @type = type
  end
end

这个的效果,和我们原先写的方式是一样的喔!但碍於这个主要是在介绍 RSpec,关於 Ruby 的基础我们就不提到太多!主要还是以通过测试的逻辑为主。

小小测验区

从第一天到现在也说了蛮多的东西了,有一些小测验希望可以让刚学的人回想一下,自己想的是错误还是正确!

  1. 哪一个方法可以在 RSpec 中建立一个 example ?
  2. 哪一个方法可以在 RSpec 中建立一个 example group ?
  3. 哪一个方法可以在 RSpec 中建立一个 assertion ? ( 类似主张、断言的感觉)
  4. expect.eq(1 + 1, 2) 这是正确的写法吗?如果是错的,为什麽?
  5. 我想要建立一个 example,只要打开一个 _spec.rb 的档案直接写就可以了吗?
  6. describe 语法一定要有参数才可以运作吗?
  7. 测试的顺序是什麽?( E2E Test, Integration Test, Unit Test )
  8. 要初始化一个 Rspec 测试的终端机指令是什麽?
  9. 你应该写测试在你写 Code 之前吗?为什麽?

这些答案在之前的文章都有提过喔!

小结

明天会在一个添加许多的 example 在一个测试之中,顺便也训练我们思考 TDD 的思绪,然後继续的面对错误,修正,重构,这样自然而然就会越来越有感觉~


<<:  Vue.js 从零开始:物件参考 深拷贝 浅拷贝

>>:  Day07_Lombok 初探

[day-28] U-net Conclusion

前言 要道尾声了,Unet的结论对於这们短的论文来说,其实算是不太重要的(看了也是)。 Conclu...

python3-日历

在python3中,想要制作日历有两种方式,先介绍第一种: -直接使用python中calendar...

Angular 图片上传之...日记文

插播 本来预定今天要发布的文章延後了,今天要要来分享这一两天的踩雷心路历,花了一半天时间,连铁人都没...

Day 2 - 聊天机器人的分类与比较

随着科技的发展,人工智慧近年来也越来越普及。人工智慧可以协助人们处理很多事情,如:车牌辨识、自驾车,...

Day2 HTML

每件事情的开头一定都有属於他自己的原因,想达成的目标、想解决的问题、後面的文章会绕着三大主轴在运转:...