rspec检查任何参数都是包含特定对的哈希

时间:2013-08-15 08:32:01

标签: ruby unit-testing rspec

我有一个共享的rspec示例,用于许多函数(休息请求)。每个函数都接收一个我要检查的哈希值,但它们可以位于不同的位置,例如:

get(url, payload, headers)
delete(url, headers)

我想写下面的测试:

shared_examples_for "any request" do
  describe "sets user agent" do
    it "defaults to some value" do
        rest_client.should_receive(action).with(????)
        run_request
      end
      it "to value passed to constructor"
    end
  end
end

describe "#create" do
  let(:action) {:post}
  let (:run_action) {rest_client.post(url, payload, hash_i_care_about)}
  it_behaves_like "any request"
end

问题是,如何编写匹配任何参数的匹配器,例如:

client.should_receive(action).with(arguments_including(hash_including(:user_agent => "my_agent")))

2 个答案:

答案 0 :(得分:0)

为了匹配任何参数,您可以将块传递给should_receive,然后可以以任何方式检查参数:

client.should_receive(action) do |*args|
  # code to check that one of the args is the kind of hash you want
end

您可以在args列表中搜索哈希类型的参数,您可以将参数传递给共享示例,指示参数列表中哈希应该存在的位置等。让我知道这是不是很清楚我可以提供更多细节。

https://www.relishapp.com/rspec/rspec-mocks/docs/argument-matchers

简要介绍了这一点

答案 1 :(得分:0)

我的例子与彼得·阿尔文建议的内容有关:

shared_examples "any_request" do |**args|
  action = args[:action]
  url = args[:url]
  payload = args[:payload]
  headers = args[:headers]
  # ...etc

  case action
    when :get
    # code to carry on

    when :post
    # code to continue

  end
end

这样,您可以随着代码的扩展,以任何顺序和任何数量来定义和使用参数。您可以像这样调用函数:

it_behaves_like "any_request", { action: :post,
                                 url: '/somewhere' }

未声明的参数,例如此示例中的:payload,会自动携带nil的值。测试它的存在,如:if payload.nil?unless payload.nil?等。

注意:这适用于Ruby 2.0,Rails 4.0,rspec 2.13.1。实际代码定义可能因早期版本而异 Note_note:... do |**args|两个星号不是拼写错误;)