这是我的代码:
operations_client.invoke_generic_operation(redeploy) do |on|
on.success do |data|
expect(data['status']).to eq('OK')
expect(data['message']).to start_with('Performed [Undeploy] on')
end
on.failure do |error|
fail 'error callback was called, reason: ' + error.to_s
end
end
但是,expects
语句对测试结果没有任何影响,如果未在“top lvl scope”上调用它,则会被忽略。我是Ruby noob,所以请光临我;)
注1:它不是一个RoR应用程序,它是一个带RSpec的简单Ruby宝石。
注意2:我已经扩展了Proc
类以便能够编写这些回调,这里是代码,我用过:
class Proc
def perform(callable, result)
self === Class.new do
method_name = callable.to_sym
define_method(method_name) { |&block| block.nil? ? true : block.call(result) }
define_method("#{method_name}?") { true }
def method_missing(method_name, *args, &block) false; end
end.new
end
end
答案 0 :(得分:1)
您可以使用该块捕获数据并在之后设置期望值。
actual_data = nil
operations_client.invoke_generic_operation(redeploy) do |on|
on.success do |data|
actual_data = data
end
on.failure do |error|
fail "error callback was called, reason: #{error}"
end
end
expect(actual_data['status']).to eq('OK')
expect(actual_data['message']).to start_with('Performed [Undeploy] on')
如果您使用较新的RSpec 3.x,您可以将其合并为一个期望:
expect(actual_data).to include(
'status' => 'OK',
'message' => start_with('Performed [Undeploy] on'),
)
但是,原始版本应按预期工作。除非发送的另一个状态不是success
或failure
;因此,expect
和fail
消息都不会被发送。在这种情况下,没有期望定义也不会失败,因此规范只会通过。
此外,还不清楚invoke_generic_operation
的作用。是否有可能吞下块所引发的任何错误?如果是这样,那也会引起问题。我上面展示的捕获方法将侧重于该过程。如果这是正在发生的事情,那么在规范中评论它可能是个好主意。