2 votes

Comment écrire un matcheur différable avec Rspec2

J'essaie d'écrire un matcher qui transforme un objet en un Hash avant de le comparer à la valeur attendue (disons que je veux comparer 2 hashes sans me soucier du fait que les clés sont des chaînes ou des symboles).

Je peux facilement définir un matcheur en faisant ceci

RSpec::Matchers.define :my_matcher do |content|
    match { |to_match| my_hash_conversion(to_match) == my_hash_conversion(content)
    diffable
end

J'ajoute diffable Ainsi, rspec affiche la différence entre les deux objets lorsqu'ils ne correspondent pas. Cependant, je veux afficher la différence des objets convertis et non celle de l'objet original ?

J'ai vu qu'il y a quelque part dans Rspec une classe Differ et une fonction diff_with_hash, mais je n'ai aucune idée de comment l'utiliser (car elle n'est pas vraiment documentée).

0voto

bibstha Points 520

Pour RSpec3, vous pouvez utiliser directement la classe Diff.

RSpec::Matchers.define :my_matcher do |expected|
  expected_hash = my_hash_conversion(expected)
  match do |actual|
    actual_hash = my_hash_conversion(actual)
    expected_hash == actual_hash
  end

  failure_message do |actual|
    actual_hash = my_hash_conversion(actual)
    "expect #{expected_hash} to match #{actual_hash}" + 
      RSpec::Support::Differ.new.diff(actual_hash, expected_hash)
  end
end

Nota: RSpec::Support dit qu'il n'est pas censé être utilisé directement.

-1voto

Ian Vaughan Points 3510

Utilisez failure_message_for_should bloc :-

failure_message_for_should do |actual|
  "expected: #{expected} \n     got: #{actual}"
end

Puis .to_hash ce que vous devez voir.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X