読者です 読者をやめる 読者になる 読者になる

元フリーエンジニアライフ

Ruby on Rails とか MovableType とかAWSやってるフリーランスウェブエンジニアの記録でした。現在は法人成りしてIT社長。

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