【问题标题】:How to access a controller constant in an rspec test under Rails 3如何在 Rails 3 下的 rspec 测试中访问控制器常量
【发布时间】:2012-08-08 02:57:01
【问题描述】:

使用 Rails 3.2 我在子目录中有一个控制器(例如 /controllers/data_feeds/acme_feed_controller.rb)

这个控制器有一些常量如下

class DataFeeds::AcmeFeedController < ApplicationController

  MY_CONSTANT = "hi

  def do_something do
    ...
  end

end

在我的 rspec 控制器规范(位于 /spec/controllers/data_feeds/acme_feed_controller_spec.rb)中,我想访问该常量,下面是我尝试过的两种方法(都在下面的代码中注释掉)

describe AcmeFeedController do
  if "tests something" do
    #c = AcmeFeedController.MY_CONSTANT
    #c = DataFeeds::AcmeFeedController.MY_CONSTANT
  end
end

我显然不了解运行规范测试的范围。我需要做什么以及为什么同样重要(即范围发生了什么)。

感谢您的帮助。

【问题讨论】:

  • 查看您遇到的错误会很有帮助。

标签: ruby-on-rails ruby testing rspec constants


【解决方案1】:

不能用点语法引用常量,所以DataFeeds::AcmeFeedController.MY_CONSTANT 在任何上下文中都不会起作用。您需要使用:: 来引用常量:DataFeeds::AcmeFeedController::MY_CONSTANT

请注意,这是一个 ruby​​ 问题,与 RSpec 无关。当您遇到这样的问题时,我建议您先弄清楚如何使用普通 ruby​​(例如在 IRB 中),然后再担心它在 RSpec 中的工作方式(通常它会是相同的,无论如何)。

如果您想知道 ruby​​ 中的常量是如何工作的,我建议您观看 this talk 详细解释它们。

【讨论】:

  • 感谢您的帮助。 (我意识到这对我之前也不起作用,但那是因为我在尝试时颠倒了模块和控制器的名称,做了正确的事情,但我错过了一个错字。)
【解决方案2】:

此外,您可以在不重复控制器类名称空间的情况下执行此操作。

describe AcmeFeedController do
  if "tests something" do
    c = controller.class.const_get('MY_CONSTANT')
  end
end

这种技巧在应用程序代码中可能不会被批准,但在测试中可能会。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多