我正在为我的测试嘲笑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 :(得分: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