1

だから、私はrspec / mochaに似た何かをしたいのですmockが、2つのオブジェクトだけで、すべてではありません。これは私がこれまでに持っているものです:

def mock(obj, method_to_mock, value)
    obj.class << obj do
        define_method(method_to_mock) do
            return value
        end
    end
end

私はこの投稿からそのように書くというアイデアを思いつきました:https ://stackoverflow.com/a/185969/356849

だから私は次のようなことをすることができます:

mock(self.instantiated, :sections, sections)

self.instantiatedそして、それは私が'ssectionsに保存したオブジェクトをSectionオブジェクトの配列で上書きしますsections

これを行う理由は、オブジェクトのシリアル化および暗号化されたバージョンを格納しているためです。オブジェクトの暗号化を解除してシリアル化を解除し、それを表示できるようにすべての関係を復元できるようにしたいからです。データベースから読み取られているかのように、私のビューのオブジェクト。しかし、それは重要ではなく、ほとんどが完了しています。

だから、私はこれを行うことができるようにしたいと思います:

mock(<Instance of object>, :<method of object that is going to be overridden, to avoid db access>, <the stuff to return when the overridden method is invoked)

obj.class << obj do現在、次の行でエラーが発生しています。

NoMethodError: undefined method `obj' for #<MyObject::Encrypted:0x7f190eebcd18>

アイデア?


アップデート

class << obj無限ループになっている2行目を変更しました。

from /home/me/.rvm/gems/ruby-1.8.7-p371@project/gems/activerecord-2.3.15/lib/active_record/connection_adapters/abstract/connection_pool.rb:351:in `retrieve_connection_pool'
from /home/me/.rvm/gems/ruby-1.8.7-p371@project/gems/activerecord-2.3.15/lib/active_record/connection_adapters/abstract/connection_pool.rb:351:in `retrieve_connection_pool'
from /home/me/.rvm/gems/ruby-1.8.7-p371@project/gems/activerecord-2.3.15/lib/active_record/connection_adapters/abstract/connection_pool.rb:325:in `retrieve_connection'
from /home/me/.rvm/gems/ruby-1.8.7-p371@project/gems/activerecord-2.3.15/lib/active_record/connection_adapters/abstract/connection_specification.rb:123:in `retrieve_connection'
from /home/me/.rvm/gems/ruby-1.8.7-p371@project/gems/activerecord-2.3.15/lib/active_record/connection_adapters/abstract/connection_specification.rb:115:in `connection'
from /home/me/.rvm/gems/ruby-1.8.7-p371@project/gems/activerecord-2.3.15/lib/active_record/base.rb:1305:in `columns'
from /home/me/.rvm/gems/ruby-1.8.7-p371@project/gems/activerecord-2.3.15/lib/active_record/base.rb:1318:in `column_names'
from /home/me/.rvm/gems/ruby-1.8.7-p371@project/gems/searchlogic-2.4.28/lib/searchlogic/named_scopes/ordering.rb:35:in `ordering_condition_details'
from /home/me/.rvm/gems/ruby-1.8.7-p371@project/gems/searchlogic-2.4.28/lib/searchlogic/named_scopes/ordering.rb:26:in `method_missing'
from /home/me/.rvm/gems/ruby-1.8.7-p371@project/gems/searchlogic-2.4.28/lib/searchlogic/named_scopes/or_conditions.rb:28:in `method_missing'
from /home/me/.rvm/gems/ruby-1.8.7-p371@project/gems/activerecord-2.3.15/lib/active_record/base.rb:2002:in `method_missing_without_paginate'
from /home/me/.rvm/gems/ruby-1.8.7-p371@project/gems/will_paginate-2.3.16/lib/will_paginate/finder.rb:170:in `method_missing_without_attr_encrypted'
from /home/me/.rvm/gems/ruby-1.8.7-p371@project/bundler/gems/attr_encrypted-a4b25f01d137/lib/attr_encrypted/adapters/active_record.rb:50:in `method_missing'
from /home/me/Work/GravityLabs/project/app/models/proposal/encrypted.rb:119:in `mock'
from /home/me/Work/GravityLabs/project/app/models/proposal/encrypted.rb:79:in `instantiate'
from /home/me/Work/GravityLabs/project/app/models/proposal/encrypted.rb:58:in `each'
from /home/me/Work/GravityLabs/project/app/models/proposal/encrypted.rb:58:in `instantiate'
4

2 に答える 2

2
def mock(obj, method_to_mock, value=nil)
  obj.define_singleton_method(method_to_mock) do value end
end  
于 2013-01-16T19:49:45.607 に答える
1

obj.class << obj do意味がありません。

あなたがおそらく言いたかったのは

def mock(obj, method_to_mock, value)
  (class << obj; self; end).class_eval do
    define_method(method_to_mock) do
      return value
    end
  end
end

(class << obj; self; end).class_eval構文は、そのシングルトンクラスを返すシングルトンクラスobjを開き、ブロックを渡すそのシングルトンクラスでclass_evalを呼び出します。

構文でobj.classは、:classメッセージをレシーバーとしてに送信します。レシーバーは、objのクラス(シングルトンクラスではありません)への参照を返します。次に、評価結果を引数として渡すメソッドをobj呼び出します。は(MyObject :: Encrypted:0x7f190eebcd1)のメソッドではないため、NoMethodErrorが発生します。<<obj do...endobjself

現代のルビーでは、比較的難解なことを言う代わりに、シングルトンクラスを取得するために、次のようなメソッド(class << obj; self; end)を使用できます。singleton_classobj.singleton_class.class_eval do ... end

于 2013-01-16T19:24:24.023 に答える