Day07 测试写起乃- let、let!、subject

昨天介绍了 before 之後今天就可以直接来看 let 搂!

let、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

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 问题

>>:  Android学习笔记02

Day20 类别与物件介绍

object---物件(东西)、概念,宇宙间任何具体的东西或抽象的事物 物件导向(object-or...

Day19 浅谈AR眼镜 未来可能取代手机的物品

今日来介绍AR眼镜,AR眼镜是将虚拟讯息投影在眼镜镜片上。常常会看到AR眼镜长得很像墨镜,其实是加了...

[Day 30] 使用 Heroku 部署机器学习 API

使用 Heroku 部署机器学习 API 今日学习目标 动手部署自己的机器学习 API 使用 Her...

Day 26. Zabbix 实际报警案例分享 - 机器服务被关机

今天跟大家分享关机与服务中断的警报,如果有仔细观察 Problem: /etc/passwd has...

拿 ml5 来练习 如何附加自己的分类在别人的情绪之上 (五)

介绍 首先介绍什麽是如何附加自己的分类在别人的情绪之上, 对别人已经训练好的情绪 model,我们对...