Zenn
Open9

【RSpec】各構文

seiya2130seiya2130

subject

  • テストの対象物、subjectはあとに続くテストで再利用できるため、各exampleで作成する必要がない
seiya2130seiya2130

expect

  • 期待値を満たしているかチェックするため実際の値を指定する
  • マッチャであるeqで期待値と正しいか検証する
seiya2130seiya2130

let

  • 呼ばれたときに初めてデータを読み込むことでテスト実行を重くしない
  • beforeブロックの外部で呼ばれるためセットアップに必要なテストの構造を減らすことができる
  • itブロックでは使用不可、describeやcontextブロックで使用可能
seiya2130seiya2130
person.rb
class Person

    def initialize(name = 'no name', age = 0)
        @name = name
        @age = age
    end

    def name
        @name
    end

    def age
        @age
    end
end
person_spec.rb
require 'rails_helper'

RSpec.describe Person, type: :class do
    subject(:default_person) { Person.new }

    describe 'initialize' do 
        it 'should return a new instance of Person' do
            expect(default_person).to be_an_instance_of(Person)
        end
    end

    describe 'name' do
        context 'when name is provided' do
            let(:person) { Person.new('test') }
            it 'should return name' do
                expect(person.name).to eq('test')
            end
        end

        context 'when name is not provided' do
            it 'should return no name' do
                expect(default_person.name).to eq('no name')
            end
        end
    end

    describe 'age' do
        context 'when age is provided' do
            let(:person) { Person.new('test', 25) }
            it 'should return age' do
                expect(person.age).to eq(25)
            end
        end

        context 'when age is not provided' do
            it 'should return 0' do
                expect(default_person.age).to eq(0)
            end
        end
    end
end

検証

https://github.com/seiya2130/rails_practice/pull/8

作成者以外のコメントは許可されていません