Я издеваюсь над частью 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
кода вообще.
Есть ли третий способ написать это?
Это был мой первый выстрел, но он еще более подробный. Я искал более «анонимный» подход. – svoop