如何对生成或使用shell命令的代码进行单元测试?

时间:2012-09-12 22:01:58

标签: ruby unit-testing shell rspec

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

我想对生成这些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
啊,似乎我已经回答了我的问题,但如果你有更好的建议,我会很高兴听到它们。

1 个答案:

答案 0 :(得分:0)

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