1

我正在编写一个 Ruby 库,它将自动执行一些 shell 命令。这些命令将取决于一组相当复杂的业务逻辑。

我想对生成这些 shell 命令的代码进行单元测试。我不确定我该怎么做;我不太关心命令的确切文本,但我想确保命令受到逻辑的影响——这当然是单元测试的目的。

我目前的想法是将命令生成封装到非常薄的类似模板的对象(或只是模板)中,并在需要生成 shell 命令时让逻辑代码调用这些对象,然后我可以检查逻辑代码是否调用了预期的方法模板代码。这仍然使模板代码未经测试,但这不如验证逻辑重要。基本上

class DirectoryMaker
  def initialize(generator)
    @generator = generator
  end
  def make_directory(name)
    if name=='baz'
      raise 'YOURE NOT ALLOWED TO DO THAT'
    else
      @generator.mkdir(name)
    end
  end
end

describe DirectoryMaker do
  it 'should produce a mkdir command' do 
    generator = double('Generator')
    generator.should_receive('mkdir').with('foo').and_return('')

    described_class.new(generator).make_directory('foo')
  end

  it 'should raise an exception when passed baz as a name' do
    expect {
      described_class.new(double('Generator')).make_directory('baz')
    }.to raise_error
  end
end

啊,看来我已经回答了我的问题,但是如果您有更好的建议,我很乐意听到。

4

1 回答 1

0

我不确定我是否理解正确。是的,您可以制作作为控制台输出(模型)抽象的薄层。您可以测试您的逻辑(控制器)是否从此抽象层生成正确的对象。您可以测试您的模板是否从模型(视图)呈现正确的 shell 输出。但是为了什么?你真的需要完整的 MVC 模式吗?你有你的逻辑应该产生一个输出 - 一个字符串。为什么不能只测试某些输入参数是否产生所需的字符串?

于 2012-09-17T21:57:46.807 回答