あなたが見つけたメソッドは確かに機能の少しをテストするために機能しますが、かなり壊れやすいようです-あなたのダミークラス(実際にStruct
はあなたのソリューションでは単に)はinclude
あなたの関心事である実際のクラスのように振る舞うかそうでないかもしれません。さらに、モデルの問題をテストする場合、それに応じてデータベースを設定しない限り、オブジェクトの有効性をテストしたり、ActiveRecordコールバックを呼び出したりすることはできません(ダミークラスにはデータベーステーブルのバッキングがないため)それ)。さらに、懸念事項をテストするだけでなく、モデル仕様内で懸念事項の動作もテストする必要があります。
では、1石で2羽の鳥を殺してみませんか?RSpecの者の使用することにより、共有の例のグループを、あなたはそれら(例えば、モデル)を使用し、実際の授業に対するあなたの懸念をテストすることができますし、あなたは彼らが使用しているどこでもそれらをテストできるようになります。また、テストを1回記述し、問題を使用するモデル仕様に含めるだけで済みます。あなたの場合、これは次のようになります:
# app/models/concerns/personable.rb
module Personable
extend ActiveSupport::Concern
def full_name
"#{first_name} #{last_name}"
end
end
# spec/concerns/personable_spec.rb
require 'spec_helper'
shared_examples_for "personable" do
let(:model) { described_class } # the class that includes the concern
it "has a full name" do
person = FactoryBot.build(model.to_s.underscore.to_sym, first_name: "Stewart", last_name: "Home")
expect(person.full_name).to eq("Stewart Home")
end
end
# spec/models/master_spec.rb
require 'spec_helper'
require Rails.root.join "spec/concerns/personable_spec.rb"
describe Master do
it_behaves_like "personable"
end
# spec/models/apprentice_spec.rb
require 'spec_helper'
describe Apprentice do
it_behaves_like "personable"
end
このアプローチの利点は、ARコールバックの呼び出しなど、ARオブジェクト以外では何もできないことに関心を持つことを始めると、さらに明白になります。