4

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

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

谢谢你的帮助。

4

2 回答 2

14

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

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

如果你想知道 ruby​​ 中的常量是如何工作的,我推荐你观看这个详细解释它们的演讲。

于 2012-08-10T19:20:10.077 回答
2

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

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

这种技巧可能不会在应用程序代码中得到认可,但在测试中可能会得到认可。

于 2017-07-13T03:25:57.980 回答