0

JSON文字列をハッシュに解析することで一致するRR用のワイルドカードマッチャーを作成しました。これは、JSON(逆)シリアル化が順序を保持しないためです。私たちが持っている場合:

{ 'foo': 42, 'bar': 123 }

...次に、(逆)シリアル化の後、updateメソッドが次のように呼び出されることがあります。

{ 'bar': 123, 'foo': 42 }

ワイルドカードマッチャーは次のようになります。

class RR::WildcardMatchers::MatchesJsonString

  attr_reader :expected_json_hash

  def initialize(expected_json_string)
    @expected_json_hash = JSON.parse(expected_json_string)
  end

  def ==(other)
    other.respond_to?(:expected_json_hash) && other.expected_json_hash == self.expected_json_hash
  end

  def wildcard_matches?(actual_json_string)
    actual_json_hash = JSON.parse(actual_json_string)
    @expected_json_hash == actual_json_hash
  end
end

module RR::Adapters::RRMethods
  def matches_json(expected_json_string)
    RR::WildcardMatchers::MatchesJsonString.new(expected_json_string)
  end
end

...そして私たちはそれを次のように使用しています:

describe 'saving manifests' do

  before do
    @manifests = [
      { :sections => [], 'title' => 'manifest1' },
      { :sections => [], 'title' => 'manifest2' }
    ]

    mock(manifest).create_or_update!(matches_json(@manifests[0].to_json)) { raise 'uh oh' }
    mock(manifest).create_or_update!(matches_json(@manifests[1].to_json))

    parser = ContentPack::ContentPackParser.new({
                                                  'manifests' => @manifests
                                                })
    @errors = parser.save
  end

  it 'updates manifests' do
    manifest.should have_received.create_or_update!(anything).twice
  end
end

これは、 RRのドキュメントに準拠しています。mock()ただし、 JSONに一致する引数を期待する代わりに、引数がMatchesJsonStringオブジェクトであると期待します。

 1) ContentPack::ContentPackParser saving manifests updates manifests
     Failure/Error: mock(Manifest).create_or_update!(matches_json(@manifests[0].to_json)) { raise 'uh oh' }
     RR::Errors::TimesCalledError:
       create_or_update!(#<RR::WildcardMatchers::MatchesJsonString:0x13540def0 @expected_json_hash={"title"=>"manifest1", "sections"=>[]}>)
       Called 0 times.
       Expected 1 times.
     # ./spec/models/content_pack/content_pack_parser_spec.rb:196
4

1 に答える 1

0

答えは、私がリンクしたドキュメントにタイプミスがあるということです。これ(私の強調):

#wildcard_matches?(other)

wildcard_matches? is the method that actually checks the argument against the expectation. It should return true if other is considered to match, false otherwise. In the case of DivisibleBy, wildcard_matches? reads:

...実際に読む必要があります:

#wildcard_match?(other)

...

私の同僚の1人は、コードをrr gemで定義されたマッチャーの1つと比較することを提案しましたが、その違いが際立っていました。

于 2012-11-05T00:47:25.333 に答える