次のように定義された懸念があります。
module Shared::Injectable
extend ActiveSupport::Concern
module ClassMethods
def injectable_attributes(attributes)
attributes.each do |atr|
define_method "injected_#{atr}" do
...
end
end
end
end
そして、このような懸念を使用するさまざまなモデル:
Class MyThing < ActiveRecord::Base
include Shared::Injectable
...
injectable_attributes [:attr1, :attr2, :attr3, ...]
...
end
これは意図したとおりに機能し、クラスのインスタンスで呼び出すことができる一連の新しいメソッドを生成します。
my_thing_instance.injected_attr1
my_thing_instance.injected_attr2
my_thing_instance.injected_attr3
私の問題は、懸念をテストしようとしているときに発生します。生成された関数はすべて同じことを行うため、懸念を使用するすべてのモデルのテストを手動で作成することは避けたいと思います。代わりに、rspec を使用shared_example_for
してテストを 1 回記述し、rspec を使用して必要なモデルでテストを実行できると考えましたit_should_behave_like
。これはうまく機能しますが、injectable_attributes
関数に渡したパラメーターへのアクセスに問題があります。
現在、共有仕様内で次のようにしています。
shared_examples_for "injectable" do |item|
...
describe "some tests" do
attrs = item.methods.select{|m| m.to_s.include?("injected") and m.to_s.include?("published")}
attrs.each do |a|
it "should do something with #{a}" do
...
end
end
end
end
これは機能しますが、これを行うには明らかに恐ろしい方法です。クラスインスタンスで既に定義されているメソッドを見るのではなく、クラスのインスタンスまたはクラス自体を介して、injectable_attributes 関数に渡された値のみにアクセスする簡単な方法はありますか?