2017-10-04 10 views
1

RSpec fournit une sortie de type "diff" lors de la comparaison de chaînes multilignes. Existe-t-il un moyen de faire quelque chose de similaire lors de la comparaison de tableaux (autre que la conversion du tableau en une chaîne à plusieurs lignes)?Activer la différenciation pour le mappeur de tableau RSpec

+0

Is ['match_array'] (http://www.rubydoc.info/github/rspec-expectations/RSpec/Matchers:match_array) ce que vous cherchez? Si non, alors quel comportement souhaité lui manque? –

+1

@TomLord 'match_array' ne prend pas en compte l'ordre des éléments, c'est-à-dire' attend ([1,2,3]). À match_array ([3,2,1]) 'passes. – Stefan

+0

Dans mon cas, l'ordre est important. – Zack

Répondre

3

Je peux me tromper, mais je ne pense pas que cette fonctionnalité est intégrée à RSpec.

Cependant, vous pourriez implement a custom matcher with a custom error message:

RSpec::Matchers.define(:eq_array) do |expected| 
    match { |actual| expected == actual } 

    failure_message do |actual| 
    <<~MESSAGE 
     expected: #{expected} 
     got:  #{actual} 

     diff:  #{Diffy::Diff.new(expected.to_s, actual.to_s).to_s(:color)} 
    MESSAGE 
    end 
end 

# Usage: 

expect([1, 2, 3]).to eq_array([1, 4, 3]) 

Cette démo utilise la bibliothèque diffy; vous pouvez implémenter cela comme bon vous semble.

+0

C'est ce que je cherchais. La clé pour moi était de savoir comment appeler le différentiel intégré. Un article plus ancien a mis en garde contre l'utilisation directe du différentiel. https://stackoverflow.com/questions/12551564/how-to-write-a-diffable-matcher-with-rspec2 – Zack