2017-01-24 1 views
-1

Je rencontre un problème lorsque j'essaie de créer une structure ouverte avec un attribut portant le même nom que l'une des méthodes d'instance OpenStruct. Plus précisément, je voudrais créer une structure ouverte qui a un attribut capture. J'utilise cela comme un talon dans un test rspec, donc je ne peux pas changer le nom de la méthode (il doit être capture)Définition de l'attribut OpenStruct avec le même nom que la méthode d'instance

#=> OpenStruct.new(capture: true).capture 
#=> ArgumentError: wrong number of arguments (0 for 1) 

regardant les méthodes de OpenStruct, il a une méthode capture et est cette méthode qui est appelée. Est-il possible d'instancier une structure ouverte avec un attribut du même nom que l'une de ses méthodes? Pour plus de clarté, j'ai spécifiquement besoin de la méthode de capture, dont j'ai confirmé les ruptures sur les rails 4.0.x mais pas sur les rails 5, mais cette situation est vraie pour toute méthode que pourrait avoir openstruct.

#=> OpenStruct.new(class: true).class 
#=> OpenStruct 

Répondre

0

Cela fonctionne très bien pour moi dans pry (course Ruby 2.3, par la voie)

[9] pry(main)> OpenStruct.new(capture: 1).capture 
=> 1 

Voici une autre façon de le faire:

[15] pry(main)> a = OpenStruct.new capture: 1 
=> #<OpenStruct capture=1> 
[22] pry(main)> a.singleton_class.class_exec { def capture; self[:capture] + 1; end } 
=> :capture 
[23] pry(main)> a.capture 
=> 2 

Je ne sais pas Quelle bibliothèque de test utilisez-vous, mais si c'est RSpec, vous pouvez également utiliser cette approche de simulation:

a = OpenStruct.new capture: 0 
allow(a).to receive(:capture).and_return(a[:capture]) 
a.capture # => 0 
+0

ça marche bien pour moi sur les rails 5 mais pas les rails 4. si vous utilisez la méthode 'class' il utilise toujours la méthode d'instance openstruct, pas l'attribut je définis – PhilVarg

+0

que voulez-vous dire" si vous utilisez la méthode 'class ""? –

+0

si vous définissez l'attribut 'class' au lieu de' capture', il utilise la méthode d'instance de structure ouverte 'class', pas l'attribut que je définis. J'ai édité ma question pour la clarté – PhilVarg