2012-11-05 53 views
0

我已经为RR创建了一个匹配JSON字符串的通配符匹配器,通过将它们解析为哈希值。这是因为JSON(de)序列化不能保持顺序;如果我们有:如何使用自定义RR通配符匹配器?

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

...然后之后(德)序列化,我们可能会发现,我们的更新方法被调用:

{ '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 documentation。然而,代替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 
+0

发布时,我注意到总共有15个问题用'rr'标记。我怀疑第一个答案可能是“不使用rr”;-) –

回答

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) 

... 

我的一位同事的建议,我们比较我们的代码与在RR宝石定义的匹配器之一,然后差异显而易见。