RSpec 2:带有通配符的哈希匹配器?

时间:2014-07-05 09:24:46

标签: ruby json api hash rspec

我开发并计划针对一组预定义的答案测试REST API,当然,在服务器的JSON响应中,URL(带有嵌入ID)等内容与(固定的)期望字符串不匹配。

是否存在rspec2(我们还没有迁移到rspec3)匹配器来比较包含字符串,Fixnums和更多哈希的(多级)哈希,其中哈希包含字符串,Fixnums, Regexps (其中可以匹配多个String和Fixnum对象)和更多Hashes?

示例:我想要这个API响应(使用JSON),

response = { 
  id: 295180,
  url: "http://foo.bar/api/v1/foobars/295180",
  active: true,
  from: "2014-10-01T13:00:00+02:00",
  to: "2014-10-11T13:00:00+02:00",
  user: {
    id: 913049,
    url: "http://foo.bar/api/v1/users/913049",
    name: "john Doe",
    age: 29,
  }
}

与此比较器匹配,该比较器可以(并且应该)包含在单独的文件中(例如,matchers.json_re)

expectation = { 
  id: /\d+/,
  url: /http:\/\/foo\.bar\/api\/v1\/foobars\/\d+/,
  active: /(true|false)/,
  from: /2014-\d{2}-\d{2}T13:00:00+02:00/,
  to: /.*/,
  user: {
    id: /\d/+,
    url: /http:\/\/foo\.bar\/api\/v1\/users\/\d+/,
    name: "john Doe",
    age: 29,
  }
}

这样的东西
response.should == hash_re(expectation)

在rspec2中。

或者API响应测试的方法是否完全不同?

1 个答案:

答案 0 :(得分:1)

没有一个内置的匹配器可以做你想要的,但是你可以用custom matcher来实现它。对于初学者来说,这可以满足您的需求:

require 'rspec/expectations'

RSpec::Matchers.define :be_hash_matching_regexes do |expected|
  match do |actual|
    expected.all? do |key, regex|
      actual[key].to_s.match(regex)
    end
  end
end

然后允许你这样做:

response.should be_hash_matching_regexes(expectation)

这个实现并没有进行你所追求的深度匹配,但扩展它应该是非常简单的。