【问题标题】:How do you unit test code that generates or uses shell commands?您如何对生成或使用 shell 命令的代码进行单元测试?
【发布时间】:2012-09-12 22:01:58
【问题描述】:

我正在编写一个 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

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

【问题讨论】:

    标签: ruby unit-testing shell rspec


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2011-02-21
      • 1970-01-01
      • 2020-06-06
      • 2010-09-05
      • 1970-01-01
      • 2012-02-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多