Die Methode, die Sie gefunden haben, funktioniert sicherlich, um ein wenig Funktionalität zu testen, scheint aber ziemlich fragil zu sein - Ihre Dummy-Klasse (eigentlich nur eine Struct
in Ihrer Lösung) kann sich wie eine echte Klasse verhalten oder nicht, die include
Ihr Anliegen ist. Wenn Sie versuchen, Modellprobleme zu testen, können Sie die Gültigkeit von Objekten nicht testen oder ActiveRecord-Rückrufe aufrufen, es sei denn, Sie richten die Datenbank entsprechend ein (da Ihre Dummy-Klasse keine Datenbanktabellenunterstützung hat es). Darüber hinaus möchten Sie nicht nur das Problem testen, sondern auch das Verhalten des Unternehmens in Ihren Modellspezifikationen testen.
Warum also nicht zwei Fliegen mit einer Klappe schlagen? Mithilfe der gemeinsam genutzten Beispielgruppen von RSpec können Sie Ihre Bedenken anhand der tatsächlichen Klassen testen, die sie verwenden (z. B. Modelle), und Sie können sie überall dort testen, wo sie verwendet werden. Und Sie müssen die Tests nur einmal schreiben und sie dann einfach in jede Modellspezifikation aufnehmen, die Ihr Anliegen verwendet. In Ihrem Fall könnte dies ungefähr so aussehen:
# 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
Die Vorteile dieses Ansatzes werden noch deutlicher, wenn Sie anfangen, Dinge in Ihrem Anliegen zu tun, wie das Aufrufen von AR-Rückrufen, bei denen weniger als ein AR-Objekt einfach nicht funktioniert.