Определение атрибута 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
Другие вопросы по тегам