Определение атрибута OpenStruct с тем же именем, что и у метода экземпляра
Я сталкиваюсь с проблемой при попытке создать открытую структуру с атрибутом, имя которого совпадает с именем одного из методов экземпляра OpenStruct. В частности, я хотел бы создать открытую структуру, которая имеет атрибут capture
, Я использую это как заглушку в тесте rspec, поэтому я не могу изменить имя метода (должно быть capture
)
#=> OpenStruct.new(capture: true).capture
#=> ArgumentError: wrong number of arguments (0 for 1)
глядя на методы OpenStruct, у него есть метод capture
и именно этот метод вызывается. Есть ли способ создания открытой структуры с атрибутом с тем же именем, что и у одного из ее методов?
для ясности, мне особенно нужен захват метода, который я подтвердил разрывы на rails 4.0.x, но не на rails 5, но эта ситуация сохраняется для любого метода, который может иметь openstruct.
#=> OpenStruct.new(class: true).class
#=> OpenStruct
1 ответ
Это прекрасно работает для меня в pry
(работает ruby 2.3, кстати)
[9] pry(main)> OpenStruct.new(capture: 1).capture
=> 1
Вот еще один способ сделать это:
[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
я не знаю, какую библиотеку тестирования вы используете, но если это RSpec, вы также можете использовать этот подход:
a = OpenStruct.new capture: 0
allow(a).to receive(:capture).and_return(a[:capture])
a.capture # => 0