通缉:最优雅的方式来编写匿名类进行模拟

时间:2014-02-03 20:22:01

标签: ruby mocking minitest

我正在为我的测试嘲笑Net :: SFTP的一部分。通过从dir.entries本地阅读,以下模仿entry.nameentry.attributes.sizefixture_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代码的粉丝。

还有第三种方式来写这个吗?

1 个答案:

答案 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