我有一个共享的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")))
答案 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|
两个星号不是拼写错误;)