Bulduğunuz yöntem kesinlikle biraz işlevselliği test etmek için işe yarayacak, ancak oldukça kırılgan görünüyor - sahte sınıfınız (aslında yalnızca Struct
çözümünüzde bir) include
sizin endişeniz olan gerçek bir sınıf gibi davranabilir veya olmayabilir . Ek olarak, modelle ilgili endişeleri test etmeye çalışıyorsanız, veritabanını uygun şekilde ayarlamadığınız sürece nesnelerin geçerliliğini test etmek veya ActiveRecord geri aramalarını başlatmak gibi şeyler yapamazsınız (çünkü kukla sınıfınız bir veritabanı tablo desteğine sahip olmayacaktır. o). Dahası, yalnızca endişeyi test etmekle kalmayıp aynı zamanda endişenin davranışını model özelliklerinizde test etmek isteyeceksiniz.
Öyleyse neden bir taşla iki kuş vurmuyorsunuz? RSpec'in paylaşılan örnek gruplarını kullanarak , endişelerinizi onları kullanan gerçek sınıflarla (örneğin modeller) karşılaştırarak test edebilirsiniz. ve onlar alıştığınız yerde bunları test etmek mümkün olacak. Ve testleri yalnızca bir kez yazmanız ve ardından endişenizi kullanan herhangi bir model spesifikasyonuna dahil etmeniz yeterlidir. Sizin durumunuzda bu şuna benzer bir şey olabilir:
# 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
Bu yaklaşımın avantajları, bir AR nesnesinden daha azının işe yaramayacağı AR geri aramalarını çağırmak gibi endişenizle ilgili şeyler yapmaya başladığınızda daha da belirgin hale gelir.