1

モジュールを含むすべてのクラスの 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]] = 値を作成するにはどうすればよいでしょうか?

4

1 に答える 1