before
用法比较像是在测试之前你需要哪些前置作业? after
就是在测试之後要做哪些事情? 由於 after
比较少使用我们就先以 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
个人最常用来在解除 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
因为有一些
明天就可以来说明 let
、let!
、subject
搂!
<<: Day 6 - 游乐场 playground & 基本语法1(宣告)
>>: D6 - 如何用 Google Apps Script 将 Google 表单收到的时间同步在 Google Calendar 上?
#14章、资料结构(Data Structure) #14-1.#阵列(array)-最常见的资料结...
tuple 可放任意物件,但不可变 ; tuple用法如下 建立多个元素 tupleSample =...
Virtual Judge ZeroJudge 题意 将输入的多行字串改变顺序後输出 需要注意的点...
如果欢迎讯息写死在程序里,临时想换还要把程序打开来改,改完还要测试,不如就直接让它能在群组里设定吧...
今天分享一些实用的网站,应该大部分都知道,但一样是做个纪录。 1.https://www.nngro...