2014-02-03 1 views
0

Я издеваюсь над частью Net :: SFTP для своих тестов. Следующие dir.entries имитирует, entry.name и entry.attributes.size считывая локально fixture_path:Требуется: Самый элегантный способ кодирования анонимного класса для насмешек

class MockedSFTP 
    mattr_accessor :fixture_path 
    def dir 
    Class.new do 
     def entries(path) 
     MockedSFTP.fixture_path.join(path.sub(%r{^/}, '')).children.map do |child| 
      OpenStruct.new(
      name: child.basename, 
      attributes: OpenStruct.new(size: child.size) 
     ) 
     end 
     end 
    end.new 
    end 
end 

Альтернативой будет:

class MockedSFTP 
    mattr_accessor :fixture_path 
    def dir 
    object = Object.new 
    def object.entries(path) 
     MockedSFTP.fixture_path.join(path.sub(%r{^/}, '')).children.map do |child| 
     OpenStruct.new(
      name: child.basename, 
      attributes: OpenStruct.new(size: child.size) 
     ) 
     end 
    end 
    object 
    end 
end 

Обе версии работают абсолютно нормально, однако, мне не нравится ни один из них. Class.new do ... end.new просто уродлив, и я не поклонник object = Object.new; ...; object кода вообще.

Есть ли третий способ написать это?

ответ

0

Как насчет фактического объявления класса?

class MockedSFTP 

    mattr_accessor :fixture_path 

    class Dir 
    def entries(path) 
     MockedSFTP.fixture_path.join(path.sub(%r{^/}, '')).children.map do |child| 
     OpenStruct.new(
      name: child.basename, 
      attributes: OpenStruct.new(size: child.size) 
     ) 
     end 
    end 
    end 

    def dir 
    Dir.new 
    end 
end 
+0

Это был мой первый выстрел, но он еще более подробный. Я искал более «анонимный» подход. – svoop

Смежные вопросы