我正在尝试验证在执行将引发异常的rake任务后是否已将文本写入文件(build.log).检查下面的代码片段,开头的代码片段,而lambda抛出一条消息,说它无法找到build.log文件.
使用开始测试.(工作)
begin
Rake::Task['git:checkout'].invoke //writes "destination already exists" to build.log
rescue
end
IO.read(@project_folder+@build_id+"/build.log").should match(/.*destination.*already.*exists.* /)
Run Code Online (Sandbox Code Playgroud)
尝试使用lambda测试相同的内容.(不起作用)
lambda {
Rake::Task['git:checkout'].invoke //writes "destination already exists" to build.log
}
IO.read(@project_folder+@build_id+"/build.log").should match(/.*destination.*already.*exists.* /)
Run Code Online (Sandbox Code Playgroud)
这两者有什么区别?
你错误地想到了lambda.lambda是可运行代码的暂停.我说暂停了,因为它已准备好运行,甚至准备接受争论,但它实际上还没有做任何事情.
例如,考虑以下(传递)规范:
flag = false
x = lambda { # Here, we suspend a function to set our flag.
flag = true
}
flag.should == false # The code in the lambda is still suspended;
# it hasn't done any work.
x.call # Now we ran the suspended function.
flag.should == true
Run Code Online (Sandbox Code Playgroud)
注意两件事:
lambda.你也得到了这个对象,但由于你没有将它分配给变量,它会立即丢失.;)call方法实际执行暂停中的代码(即在lambda中).在您给出的示例中,您实际上根本没有运行git:checkout任务!begin ... rescue ... end是一种完全不同的机制:目的是正确处理(或在您的情况下,吞下)异常.坚持这种形式; 它是唯一能满足您需求的产品.:)
| 归档时间: |
|
| 查看次数: |
453 次 |
| 最近记录: |