【问题标题】:Hint or infer the return type for RSpec let() implementing FactoryGirl create()提示或推断 RSpec let() 实现 FactoryGirl create() 的返回类型
【发布时间】:2025-11-25 14:00:01
【问题描述】:

使用 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 } 

cludge 可以,但是很好。非常感谢任何建议。也许甚至有办法让工厂处理它,但这似乎是一个“太深”的抽象,无法被 RubyMine 采用?

【问题讨论】:

    标签: ruby rspec factory-bot rubymine yard


    【解决方案1】:

    不是立竿见影的解决方案,但是:

    在谷歌上搜索时,我遇到了https://github.com/JetBrains/ruby-type-inference,它对未来很有希望,这可能与任何对此问题感兴趣的人有关。

    来自自述文件:

    ruby-type-in​​ference 项目是一种全新的方法,通过提供更可靠的符号解析和类型推断来解决 Ruby 动态性质的问题。

    在回答我问他们的一些问题时:

    我们将在 2017.3 版本中使该插件正常工作并公开可用,尽管它肯定会处于“测试版”,因为即使在理论上也有几个问题尚未解决。为了让一切真正正常工作,我们必须在 IDE 方面重新设计我们的类型系统,这很可能不会在 2017 年完成。

    它现在可能正在运行,但是......结果更多的是实验价值......[并且]很难每天使用它。

    【讨论】:

      【解决方案2】:

      这是一个旧请求,但正在更新以供将来参考https://youtrack.jetbrains.com/issue/RUBY-19907 讨论:

      截至今天(RubyMine 2021.2.3,Build #RM-212.5457.52)Rubymine 现在可以在 let 内自省 FactoryBot create 的正确类型,因此:

      let(:name) { create(:some_model)} 现在从工厂推断出正确的类型。

      但是,能够注释无法自省的 let 仍然很有用(也许它没有调用 FactoryBot)。

      但是@yieldreturn 的建议似乎是错误的——这是针对需要阻塞的方法。但是如果你可以用 @return 标签来注释 let(:whatever){} 那就太好了。比较 https://rubydoc.info/gems/yard/file/docs/Tags.md#yieldreturnhttps://rubydoc.info/gems/yard/file/docs/Tags.md#return

      【讨论】:

        最近更新 更多