3

a は b の json サブセットです。

  • object の場合、b には a と同様にすべてのキーと値のペアがあります。
  • 配列の場合、b は a と同じサイズですが、順序は関係ありません

    {"one":1}.should be_subset_json({"one":1,"two":2})
    [{"one":1}].should_NOT be_subset_json([{"one":1},{"two":2}])
    [{"two":2},{"one":1}].should be_subset_json([{"one":1},{"two":2}])
    [{"id":1},{"id":2}].should be_subset_json([{"id":2, "name":"b"},{"id":1,"name":"a"}])
    
4

1 に答える 1

3

そこに仕様を実装するだけでうまくいくようです。

require 'json'

def diff_structure(a, b)
  case a
  when Array
    a.map(&:hash).sort == b.map(&:hash).sort
  when Hash
    a.all? {|k, v| diff_structure(v, b[k]) }
  else
    a == b
  end
end

RSpec::Matchers.define :be_subset_json do |expected|
  match do |actual|
    diff_structure JSON.parse(actual), JSON.parse(expected)
  end
end

describe "Data structure subsets" do
  specify { '{"one":1}'.should be_subset_json('{"one":1,"two":2}') }
  specify { '[{"one":1}]'.should_not be_subset_json('[{"one":1},{"two":2}]') }
  specify { '[{"two":2},{"one":1}]'.should be_subset_json('[{"one":1},{"two":2}]') }
  specify { '{"a":{"one":1}}'.should be_subset_json('{"a":{"one":1,"two":2}}') }
end

# Data structure subsets
#   should be subset json "{\"one\":1,\"two\":2}"
#   should not be subset json "[{\"one\":1},{\"two\":2}]"
#   should be subset json "[{\"one\":1},{\"two\":2}]"
#   should be subset json "{\"a\":{\"one\":1,\"two\":2}}"
# Finished in 0.00172 seconds
# 4 examples, 0 failures
于 2013-08-28T20:54:26.740 に答える