我正在编写一个可以自动执行某些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
啊,似乎我已经回答了我的问题,但如果你有更好的建议,我会很高兴听到它们。
答案 0 :(得分:0)
我不确定我是否正确理解你。 是的,你可以使薄层成为控制台输出(模型)的抽象。您可以测试您的逻辑(控制器)是否从此抽象层生成正确的对象。并且您可以测试模板是否从模型(视图)呈现正确的shell输出。但是为了什么?你真的需要完整的MVC模式吗? 你有你的逻辑应该产生一个输出 - 一个字符串。为什么你不能测试一些输入参数是否产生了所需的字符串?