Подсказка или вывод типа возврата для функции 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

Другие вопросы по тегам