昨天介绍了 before
之後今天就可以直接来看 let
搂!
let
=> 被呼叫才会执行赋值
let!
=> 等同於before(:each)
describe '#change_name' do
let(:user) { User.create!(name: 'test') }
it 'no user' do
expect(User.count).to eq(0)
end
it 'one user' do
user
expect(User.count).to eq(1)
end
end
跑测试会发现通过了! 就能证明 let
在没有呼叫时是不会做的那麽如果换成 let!
呢?
$ rspec spec/models/user_spec.rb
.F.
Failures:
1) User#change_name no user
Failure/Error: expect(User.count).to eq(0)
expected: 0
got: 1
(compared using ==)
# ./spec/models/user_spec.rb:11:in `block (3 levels) in <top (required)>'
Finished in 0.11105 seconds (files took 3.9 seconds to load)
3 examples, 1 failure
这时会发现就算没有呼叫user
在第一个 it
还是做了 User.create!(name: 'test')
也就应证了 let!
其实就是 before(:each)
的概念
至於第二个测试没有错是在於 它已经做过了 let!(:user)
当然在呼叫一次一样的实体并不会在重新 create
let
最常拿来与 FactoryBot 搭配使用 之後范例也都会使用到 let
来做测试现在先简单介绍
subject
在测试不同 type 时预设给的值都不一样
# type: :model
subject = #<User id: nil, created_at: nil, updated_at: nil, name: nil, email: nil, phone: nil>
# type: :controller
subject = #<UserController:0x007f842e3f58b8>
subject
其实等同於 let
差异性就是 subject
是可以做隐性调用,过去是拿来与 should
一起搭配 但现在更主流是主动式的 expect
,比起should
更好阅读!
describe 'validations' do
it { should validate_presence_of(:name) }
# 等於 it { subject.should validate_presence_of(:name) }
end
当然在各个不同的 describe
之间也能更改 subject
require 'rails_helper'
describe 'validations' do
it { should validate_presence_of(:name) }
end
describe '#change_name' do
subject { User.create!(name: 'test').change_name('') }
it { should eq(false) }
end
更详细的解说可以看这篇 Rspec 中 let / let!(惊叹号) / Instance variables / subject 的用法与差异
在测试之中,我更推荐使用 let
。如果用到实体变数的话怕会造成测试之间因为共同的实体变数而出错 在测试与测试之间最好不要进行任何干扰才能最精准的测试。除非是逼不得已因为有时候使用before(:all)
的效能比起let
会更好,这时候就要判断使用before(:all)
会不会有干扰了...
明天就来介绍 Database Cleaner 吧!
<<: CompTIA Network+ 认证考试 N10-007 模拟测试 PDF 问题
object---物件(东西)、概念,宇宙间任何具体的东西或抽象的事物 物件导向(object-or...
今日来介绍AR眼镜,AR眼镜是将虚拟讯息投影在眼镜镜片上。常常会看到AR眼镜长得很像墨镜,其实是加了...
使用 Heroku 部署机器学习 API 今日学习目标 动手部署自己的机器学习 API 使用 Her...
今天跟大家分享关机与服务中断的警报,如果有仔细观察 Problem: /etc/passwd has...
介绍 首先介绍什麽是如何附加自己的分类在别人的情绪之上, 对别人已经训练好的情绪 model,我们对...