【发布时间】: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