1

我有一个用于许多功能(休息请求)的共享 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")))
4

2 回答 2

0

我的例子与 Peter Alfvin 的建议有点结合:

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|这两个星号不是错字;)

于 2013-08-23T23:30:56.650 回答
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中有简要介绍

于 2013-08-15T14:33:14.507 回答