如何从内部块中失败RSpec测试?

时间:2016-03-07 18:11:41

标签: ruby rspec

这是我的代码:

  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

1 个答案:

答案 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'),
)

但是,原始版本按预期工作。除非发送的另一个状态不是successfailure;因此,expectfail消息都不会被发送。在这种情况下,没有期望定义也不会失败,因此规范只会通过。

此外,还不清楚invoke_generic_operation的作用。是否有可能吞下块所引发的任何错误?如果是这样,那也会引起问题。我上面展示的捕获方法将侧重于该过程。如果这是正在发生的事情,那么在规范中评论它可能是个好主意。