あなたのうちの何人かはすでにこれで私の正気を疑っていることは分かっています。私はActiveRecord
クラスを持っています。このクラスは、欠けているメソッドを使用して、JSON属性内に掘り下げています。Rails/Rspec respond_to method_missing lookup
# app/models/request_interactor.rb
...
def method_missing(method_sym, *arguments, &block)
return self.request_params[method_sym.to_s] if self.request_params[method_sym.to_s]
super
end
テストは、私は、テスト内で結合しようとしたこの
before(:each) do
@ri = RequestInteractor.create(result: {magic_school: true, magic_learnt: 'all things magical'}, request_params: {application_id: 34, school_id: 20, school_name: 'Hogwarts', course_name: 'Defence against the Dark Arts.'})
end
it 'should respond to attributes set in the request parameters' do
expect(@ri).to respond_to(:school_name)
expect(@ri.school_name).to eq('Hogwarts')
end
、@ri.school_name
は'Hogwarts'
をeqでますように見えますが、それはresponds_to
を実行するとき、それはそのような方法は存在しないと言って失敗します!汚い、汚れた嘘つき!
私がモデルにこのような何かをやってみました:私の一日の運命はあなたの中にある今..だから
def respond_to?(method, include_private = false)
super || self.respond_to?(method, include_private)
end
しかし、これが原因で再帰の、ために再帰の、あまりにも深いスタックレベルを返します。手!大いなるものを私に教えてください。どのようにしてメソッドの欠落に対する応答をテストしますか?
Hey @muichkineご意見ありがとうございます、私は委任パターンの使用については考えていませんでした。私は本当に好きです!私が使用している唯一の予約は、 'request_params'がJSONオブジェクトであるため、ハッシュであるかのようにこれにアクセスする必要があるということです。だから、おそらくメソッドを忘れたままにしてから、デリゲートパターンを使って応答するためのフックを提供してください。要求パラメータはオブジェクトに早期に割り当てられ、RIオブジェクトは後で保存されるので、アクセサのメタにはbefore_saveフィルタを使用する必要があります。それは最高のように見える代表団のパターンを試してみましょう:) TY – TheLegend