タケユー・ウェブ日報

Ruby on Rails や Flutter といったWeb・モバイルアプリ技術を武器にお客様のビジネス立ち上げを支援する、タケユー・ウェブ株式会社の技術ブログです。

ActiveRecordモデルにincludeしたりするModuleの結合テスト

テストのモデルを作って使う方法メモ。

参考にしたコード

CarrierWave::ActiveRecordのテスト

carrierwave/activerecord_spec.rb at 7d4713f251399ca6f107e0660616cd7b9494929c · carrierwaveuploader/carrierwave · GitHub

require 'rails_helper'

# インタフェース的に使うFeatureモジュールのテスト例

# テスト用のActiveRecordモデル
class FeatureTestObject < ActiveRecord::Base
  include Feature
end
$arclass = 0

# とそのマイグレーションを用意して
class FeatureTestMigration < ActiveRecord::Migration
  def self.up
    create_table 'feature_test_objects', :force => true do |t|
    end

  end

  def self.down
    drop_table 'feature_test_objects'
  end
end

describe Feature do
  # migrate/rollbackの実行
  before(:all) { FeatureTestMigration.up }
  after(:all) { FeatureTestMigration.down }

  # after_rollbackコールバックやafter_commitコールバックでエラーを発生する場合にrescueしない
  before :all do
    ActiveRecord::Base.raise_in_transactional_callbacks = true
  end

  # テスト毎に新しいクラスオブジェクトを使うようにする
  # クラスのインスタンス変数をテストごとに共有してしまわないようにする?
  before do
    $arclass += 1
    @class = Class.new(FeatureTestObject)
    Object.const_set("FeatureTestObject#{$arclass}", @class)
    @class.table_name = 'feature_test_objects'
  end

  # テスト本体
  describe ".hoge=(fuga)" do 
    before do 
      @class.hoge = 'fuga'
    end
    it do
      expect(@class.new.hoge).to eq('fuga')
    end
  end
end