Подсказка или вывод типа возврата для функции RSpec let(), реализующей FactoryGirl create()
Используя RubyMine, в тесте rspec, есть ли способ сообщить RubyMine тип создаваемого объекта (для автозаполнения и подавления предупреждений "не удается найти"?
например:
# @yieldreturn [Tibbees::Tibbee]
let!(:tibbee) {
create(:tibbee,
canonical_vendible: article_vendible,
owner: tibbee_user)
}
RubyMine, похоже, не распознает @yieldreturn (и я не уверен, что это так или иначе правильно), и мне не повезло с @type и @return.
let!(:tibbee) { create(...) || Tibbees::Tibbee.new }
обломок работает, но юк. Любой совет с благодарностью. Возможно, есть даже способ позволить фабрикам позаботиться об этом, но это кажется "слишком глубокой" абстракцией, чтобы ее можно было подхватить RubyMine?
2 ответа
Не немедленное решение, но:
Пока гуглял по этому вопросу, я наткнулся на https://github.com/JetBrains/ruby-type-inference который дает большие перспективы на будущее, что, вероятно, актуально для всех, кто интересуется этим вопросом.
Из README:
Проект ruby-type-inference - это совершенно новый подход к решению проблем динамической природы Ruby, обеспечивающий более надежное разрешение символов и вывод типов.
В ответ на некоторые вопросы я задал им:
Мы собираемся сделать плагин рабочим и общедоступным с выпуском 2017.3, хотя он определенно будет в "бета-версии", поскольку некоторые проблемы еще предстоит решить даже с теоретической точки зрения. Чтобы все работало правильно, мы должны переработать нашу систему типов на стороне IDE, которая, скорее всего, не будет завершена в 2017 году.
Это может быть выполнено в данный момент, однако... результаты имеют больше экспериментальной ценности... [и] будет трудно использовать его ежедневно.
Это старый запрос, но обновленный для дальнейшего использования с обсуждением на https://youtrack.jetbrains.com/issue/RUBY-19907:
На сегодняшний день (RubyMine 2021.2.3, сборка № RM-212.5457.52) Rubymine теперь может самостоятельно анализировать правильный тип для создания FactoryBot в рамках let, так что:
let(:name) { create(:some_model)} теперь имеет правильный тип, выведенный на заводе.
Однако было бы полезно иметь возможность аннотировать let, который не может быть проанализирован (возможно, он не вызывает FactoryBot).
Но предложение @yieldreturn кажется неправильным - это для методов, которые принимают блок. Но было бы неплохо, если бы вы могли аннотировать let(:whatever){} тегом @return. Сравните https://rubydoc.info/gems/yard/file/docs/Tags.md#yieldreturn с https://rubydoc.info/gems/yard/file/docs/Tags.md#return