11
votes

Existe-t-il un moyen élégant de tester si une méthode d'instance est un alias pour un autre?

Dans un test unitaire, j'ai besoin de tester si les méthodes d'alias définies par Alias_Method ont été correctement définies. Je pourrais simplement utiliser les mêmes tests sur les alias utilisés pour leurs originaux, mais je me demande s'il existe une solution plus définitive ou plus efficace. Par exemple, existe-t-il un moyen de 1) une déréférence un alias de méthode et de renvoyer son nom d'origine, 2) Obtenez et comparez une sorte d'identifiant ou d'adresse de méthode sous-jacente, ou 3) obtenir et comparer les définitions de la méthode? Par exemple: xxx

suggestions?


3 Réponses :


18
votes

Selon la documentation de Méthode ,

Deux objets de méthode sont égaux si cela sont liés au même objet et contenir le même corps.

appeler méthode d'objet # / code> et comparer la méthode Les objets qu'il renvoie vérifiera que les méthodes sont équivalentes: xxx


4 commentaires

J'étais sûr que je me suis souvenu que cela ne fonctionnait pas, mais je viens de l'essayer de confirmer et cela fonctionne de manière cohérente dans Ruby 1.8, 1.9 et MacRuby. Mais je ne le vois toujours pas à Rubyspec, il ne fonctionnera donc probablement pas sur une implémentation non liée.


De plus, en général, des méthodes qui ont simplement des corps identiques, mais ne sont pas copiées une de l'autre sont catégoriquement pas égales. Preuve: classe.new {def foo () fin; DEF bar () fin; met instance_method (: foo) == instance_method (: bar)}


@CHUCK: Merci d'avoir souligné cela. J'aurais dû essayer.


De plus, "retourne true sur les méthodes aliasées" de Github.com/ rubyspec / rubyspec / blob / maître / noyau / ... + GITUB.COM/RUBYSPEC/RUBYSPEC/BLOB/MASTER/CORE/METHOD/SHARED/ ... semble couvrir m.method (: bar) == m.method ( : foo) quand on est un alias de l'autre.



3
votes

La méthode de BK1E fonctionne la plupart du temps, mais je viens de frapper le cas où il ne fonctionne pas: xxx

La sortie est produite dans Ruby 1.9, pas sûr si c'est un Bug ou non depuis Ruby 1.8 produit vrai pour la dernière ligne. Donc, si vous utilisez 1.9, soyez prudent si vous aliasez une méthode de classe héritée (comme la classe # nouvelle), ces deux méthodes sont liées au même objet (l'objet de la classe flux ), mais ils sont considérés comme pas équivalents par Ruby 1.9.

Ma solution de contournement est simple - alias la méthode originale et testez l'égalité des deux alias: xxx

espoir Cela aide.

mise à jour:

voir http://bugs.ruby-lang.org/issues/7613

SO méthode # == devrait retourner faux dans ce cas depuis un super appel serait d'appeler des méthodes différentes; ce n'est pas un bug.


0 commentaires

1
votes

appeler myClass.instance_mesthod (: foo) code> résultera UNBOULEMETHOD instance, qui a EQL? code> méthode.

La réponse est la suivante: P>

describe MyClass do
  subject { described_class }

  specify do
    expect(subject.instance_method(:foo)).to be_eql(subject.instance_method(:bar))
  end
end


0 commentaires