モジュールを含むすべてのクラスの DSL を作成しようとしています。株の取り扱いです。
これが私のテストです:
context 'when price is provided' do
let(:stock_with_price) {
class Stock
include StopLimit
stock_attributes price: 3.33
end
Stock.new
}
it 'sets the price to given value' do
stock_with_price.price.should eq(3.33)
end
end
これはこれまでの私のモジュールです:
module StopLimit
DEFAULT_STOCK_PRICE = 0
def self.included(base)
attr_accessor :price
def base.stock_attributes(options = {})
define_method('price') do
instance_variable_get("@price") ? instance_variable_get("@price") : DEFAULT_STOCK_PRICE
end
options.each_pair do |attribute, value|
if self.method_defined?(attribute)
instance_variable_set("@#{attribute.to_s}", value)
# raise instance_variable_get("@price").inspect <-- This prints out 3.33!
end
end
end
end
end
私のテストは壊れているようです。stock.price
返品中0
です。インスタンス変数が正しいものを出力するのに、テストが失敗するのはなぜですか?
アップデート:
これは機能します:
options.each_pair do |attribute, value|
if self.method_defined?(attribute)
@price = value
end
end
ただし、ハードコードされています。インスタンス変数の値を動的に作成および設定して、すべての属性と値のペアをループし、それぞれに @[[attribute]] = 値を作成するにはどうすればよいでしょうか?