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