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
1
A
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
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? –
@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
Dans mon cas, l'ordre est important. – Zack