Day06 测试写起乃 - before、after

before 用法比较像是在测试之前你需要哪些前置作业? after 就是在测试之後要做哪些事情? 由於 after 比较少使用我们就先以 before 为主,我们先看以下超简单的范例

before

# user.rb
  def change_name(new_name)
    return false if new_name.blank?

    self.name = new_name
    save!
  end
end
#user_spec.rb
describe '#change_name' do
  it 'will change the name' do
    @user = User.create!(name: 'test')
    @user.change_name('new_name')
    expect(@user.name).to eq('new_name')
  end

  it 'will not change name' do
    @user = User.create!(name: 'test')
    @user.change_name('')
    expect(@user.change_name('')).to eq(false)
  end
  end

如果用 before 修改可以写成以下,预设为before(:each)

#user_spec.rb
describe '#change_name' do
    before do
      p '这是before'
      @user = User.create!(name: 'test')
    end

    it 'will change the name' do
      @user.change_name('new_name')
      expect(@user.name).to eq('new_name')
    end

    it 'return false if name is blank' do
      expect(@user.change_name('')).to eq(false)
    end
  end

这麽做的好处就是可以将一些 it 会重复使用到的 code 放到 before 里节省 code

但仔细看会发现如果是使用 before(:each) 的话在执行两个 it 前会进去 before

$ rspec spec/models/user_spec.rb
.."这是before"
."这是before"
.

Finished in 0.13856 seconds (files took 3.94 seconds to load)
4 examples, 0 failures

如果是before(:all)呢?

rspec spec/models/user_spec.rb
.."这是before"
..

Finished in 0.11651 seconds (files took 3.64 seconds to load)
4 examples, 0 failures

只会进去一次!所以说

before(:each) => 在每个 it 之前执行
beofore(:all) => 在每个 describe 之前执行
beofore(:suite) => 在每个测试档之前执行(很少用到就不举例了)

有更多 before 用法可以在 before-and-after-hooks 查到

想知道每个 before 先後排序可以看这篇
in-rspec-whats-the-difference-between-beforesuite-and-beforeal

after

after 个人最常用来在解除 TimeCop.freeze(),有些测试会去针对时程上或是讯息含有时间时就会推荐先将测试前指定时间点并在after 复原。这样一来整个区间内都会在 Timecop 指定的时间中。

RSpec.describe User, type: :model do
  before(:all) do
    Timecop.freeze(Time.current)
  end

  after(:all) do
    Timecop.return
  end
  
  describe '#change_name' do
    before do
      p '这是before'
      @user = User.create!(name: 'test')
    end

    it 'will change the name' do
      @user.change_name('new_name')
      expect(@user.name).to eq('new_name')
    end

    it 'return false if name is blank' do
      expect(@user.change_name('')).to eq(false)
    end
  end
end

因为有一些
明天就可以来说明 letlet!subject搂!


<<:  Day 6 - 游乐场 playground & 基本语法1(宣告)

>>:  D6 - 如何用 Google Apps Script 将 Google 表单收到的时间同步在 Google Calendar 上?

资料结构(Data Structure),#阵列(array)-最常见的资料结构

#14章、资料结构(Data Structure) #14-1.#阵列(array)-最常见的资料结...

Day -10 tuple与List

tuple 可放任意物件,但不可变 ; tuple用法如下 建立多个元素 tupleSample =...

Day 0xA UVa490 Rotating Sentences

Virtual Judge ZeroJudge 题意 将输入的多行字串改变顺序後输出 需要注意的点...

【PHP Telegram Bot】Day26 - 入群欢迎机器人(2):设定欢迎讯息

如果欢迎讯息写死在程序里,临时想换还要把程序打开来改,改完还要测试,不如就直接让它能在群组里设定吧...

007-小工具

今天分享一些实用的网站,应该大部分都知道,但一样是做个纪录。 1.https://www.nngro...