カテゴリー:
Rails
タグ:
 Rails Rspec テスト module

このエントリーをはてなブックマークに追加
更新日時:
2013年08月15日(木)
作成日時:
2013年08月15日(木)

前の記事 / 次の記事

1.コントローラーにincludeされることが前提であるモジュール

1.1 ActionController::Baseを継承している必要がある場合

controller do; end にモジュールをincludeしてテストする

require 'spec_hepler'

describe ExplosionAble do
  controller do
    include ExplosionAble
    def index
      render text: "success!"
    end
  end

  describe "esplode" do
    it "爆発する" do
      expect(controller.explode).to eq "ドカーン!"
    end
  end

  describe "任意のアクション実行時に" do
    it "@bombに爆弾がセットされる" do
      get :index
      expect(assigns :bomb).to be_a_new Bomb
    end
  end
end

AnonimousController(controller do; end)については
RspecでコントローラーのModuleのテストをAnonymousControllerを使って書く に書きました。

2.2.ActionController::Baseを継承している必要がない場合

オブジェクト拡張によりモジュールをincludeしてテストする
=> 特定の依存関係を必要としないモジュールと同じ

2.モデルにincludeされることが前提であるモジュール

2.1.ActiveRecord::Baseを継承している必要があるが、実テーブルは不要な場合

任意のクラスにモジュールをincludeしてテストする

requre 'spec_helper'

describe MasterRecordAble do
  class AnonymousModel < ActiveRecord::Base
    include MasterRecordAble
  end

  describe "include" do
    it "デフォルトスコープがidの降順になる" do
      expect(AnonymousModel.all.to_sql)to eq AnonymousModel.unscoped.order("id desc").to_sql
    end
  end
end

2.2.ActiveRecord::Baseを継承している必要があり、かつ実テーブルが必要な場合

要検討

モジュールをインクルードする予定のクラスを使ってテストするのはモジュールのテストとして微妙な気がするし、
テストのためだけに本番にないテーブルをつくるっていうのは将来的に地雷になりそうな気がすし、
そもそもそんな依存関係の強いモジュールができてしまった時点で何かが間違っている気もする。

2.3.ActiveRecord::Baseを継承している必要がない場合

オブジェクト拡張によりモジュールをincludeしてテストする
=> 特定の依存関係を必要としないモジュールと同じ

3.特定の依存関係を必要としないモジュール

オブジェクト拡張によりモジュールをincludeしてテストする

requre 'spec_helper'

describe HelloWorld do
  subject do
    obj = Class.new
    obj.extend HelloWorld

    # もしくは
    # class << obj
    #   include HelloWorld
    # end

    obj
  end

  describe "say" do
    it "「HelloWorld」と出力する" do
      expect(subject.say).to eq "HelloWorld"
    end
  end
end

4.備考

オブジェクト拡張を使って頑張って前提となるクラスを生成すれば、どんなケースでもなんとかなる。

参考