【问题标题】:Rspec: how to execute ApplicationController method from feature specRspec:如何从功能规范执行 ApplicationController 方法
【发布时间】:2017-06-28 20:16:43
【问题描述】:

这是一个简单(也许很常见)的问题,但我找不到明确的答案。

我正在使用 Rspec 和 Capybara 从虚拟应用程序测试我的 Rails 引擎。在我的功能规范中,我需要使用一个名为 get_component()ApplicationController 方法和一个特定的参数。我该怎么做?

我的功能测试是:

require "rails_helper"

describe "My test", type: :feature do
    it "gets a component if slug is provided" do
        # ...
        component = ApplicationController.get_component( slug )
        # ...
    end
end

返回

NoMethodError:
undefined method `get_component' for #<ApplicationController:0x007ff7207234f8>

我不想模拟/存根该方法,我希望它真正运行。

另外,应用程序ApplicationController 应该继承引擎一,不是吗?所以调用ApplicationController是对的吧?

【问题讨论】:

  • 你找不到任何相关信息的原因是你真的不应该在功能测试中这样做。功能测试应该从用户的角度通过浏览器进行。
  • 我明白了,但我需要检查用户所取得的成就是否是预期的功能:即在完成表单后添加一个新组件。这还是我不应该做的事吗?
  • 假设组件在应用程序的某个地方显示给用户,您应该检查组件是否显示在 UI 中,而不是尝试直接从数据库中获取它。您正在尝试的更适合不同类型的测试(请求、控制器等)
  • 我明白你的意思。但是有一个问题:在控制器测试中会以不同的方式编写吗?显然,从应用程序中使用该方法(属于引擎)无论如何都需要该技巧。属于应用程序的ApplicationRecord 似乎没有继承属于引擎的ApplicationRecord 的方法。或者我做错了什么,是吗?
  • 我不确定我是否理解您的问题,或者您现在为什么要谈论 ApplicationRecord?主要应用 ApplicationController 不从引擎继承,它们是单独作用域的 - guides.rubyonrails.org/engines.html。控制器测试在被测试的控制器范围内运行,因此如果您在创建引擎记录的控制器中进行测试,您应该能够加载这些引擎记录,除非我完全误解了您要执行的操作.

标签: ruby-on-rails rspec capybara


【解决方案1】:

请记住,get_component 是实例方法,而不是类方法,因此您只能在 ApplicationController 对象上调用它,而不能在类本身上调用它。试试这个吧……

component = ApplicationController.new.get_component( slug )

【讨论】:

  • 谢谢史蒂夫。这适用于应用程序方法。当我想要一个引擎方法时,我发现我需要像 MyEngine::ApplicationController.new.get_component( slug ) 这样从引擎类中调用它。我以为应用程序ApplicationRecord 继承了引擎类,但显然它没有。
猜你喜欢
  • 1970-01-01
  • 2016-11-28
  • 2014-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-13
  • 2018-02-05
相关资源
最近更新 更多