我开发并计划针对一组预定义的答案测试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响应测试的方法是否完全不同?
答案 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)
这个实现并没有进行你所追求的深度匹配,但扩展它应该是非常简单的。