Bulduğunuz yöntem, biraz işlevselliği test etmek için işe yarayacaktır, ancak oldukça kırılgan görünüyor — kukla sınıfınız (aslında çözümünüzde sadece bir Struct
), include
'un endişeleriniz gibi gerçek bir sınıf gibi davranabilir veya davranmayabilir. Ek olarak, model endişelerini test etmeye çalışıyorsanız, veritabanını buna göre ayarlamadığınız sürece nesnelerin geçerliliğini sınama veya ActiveRecord geri çağırmalarını çağırma gibi şeyler yapamayacaksınız (çünkü kukla sınıfınızın bir veritabanı tablosu desteğine sahip olmayacağı için) o). Ayrıca, sadece endişeyi test etmekle kalmayacak, aynı zamanda endişe davranışlarını model özellikleriniz içinde de test edeceksiniz. Öyleyse neden iki kuşu bir taşla öldürmüyorsun? RSpec'in shared example groups'u kullanarak, endişelerinizi kullanan gerçek sınıflara (örn., Modeller) ve karşı test edebilirsiniz. Bunları kullanıldıkları her yerde test edebilirsiniz. Ve sadece testleri bir kez yazmanız ve sonra bunları endişelerinizi kullanan herhangi bir model spesifikasyonuna eklemeniz yeterlidir. Senin durumunda bu böyle görünebilir:
# 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 = FactoryGirl.create(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
Bir AR nesnenin daha azı sadece 'kazandı nerede, AR geri aramalar çağırma gibi endişe şeyler yapmaya başlarsa daha da belirgin hale bu yaklaşımın avantajları Yap.
Hangi sınama çerçevesi kullanıyorsunuz? Ayrıca, hatırlanabilir ki sadece normal bir Ruby modülüdür. Diğer karışımları test edeceğiniz gibi test edin. –
"ActiveSupport :: Concern" Rails'den çıkarılmadı mı? Biraz önce gittiğini düşündüm. – Russell
@LeeJarvis w/FactoryGirl –