Метод, который вы нашли, наверняка будет работать, чтобы протестировать немного функциональности, но выглядит довольно хрупким - ваш фиктивный класс (фактически только Struct
в вашем решении) может или не может вести себя как настоящий класс, который вас беспокоит. Кроме того, если вы пытаетесь проверить проблемы модели, вы не сможете делать такие вещи, как проверка достоверности объектов или вызов обратных вызовов ActiveRecord, если вы не настроите базу данных соответственно (поскольку ваш фиктивный класс не будет иметь поддержку таблицы базы данных Это). Более того, вы захотите не только протестировать концерн, но и проверить поведение концерна внутри своих моделей.
Так почему бы не убить двух зайцев одним выстрелом? Используя RSpec shared example groups, вы можете проверить свои проблемы против фактических классов, которые ими пользуются (например, модели) и, вы сможете протестировать их везде, где они используются. И вам нужно только написать тесты один раз, а затем просто включить их в любую модель спецификации, которая использует вашу озабоченность. В вашем случае, это может выглядеть примерно так:
# 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
Преимущество такого подход становится еще более очевидным, когда вы начинаете делать вещи в вашей заботе, как применение AR обратных вызовов, где все меньше объекта AR только что выиграли» т. е. делать.
Какие рамки тестирования вы используете? Также помните, что Personable является обычным модулем Ruby. Протестируйте его так же, как вы проверите любой другой микс. –
Не удалось ли «ActiveSupport :: Concern» удалить Rails? Я думал, что прошло немного раньше. – Russell
@LeeJarvis Я использую Rspec вдоль w/FactoryGirl –