我正在编写一个 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
啊,看来我已经回答了我的问题,但是如果您有更好的建议,我很乐意听到。