当我尝试将测试写入控制器中的方法时,我收到undefined method host error.
。下面是示例代码块
在rspec文件中:
require 'rails_helper'
RSpec.describe FooController, type: :controller do
before do
@controller = FooController.new
@controller.params = ActionController::Parameters.new({ foo_id: foo.id, })
@set_foo = @controller.send(:set_foo_data)
end
以及在foo控制器中:
def set_foo_data
@foo_data = {
table_type: :foo,
.
.
data_url: foos_path,
}
end
data_url部分导致此问题。
我检查了byebug和data_url是零。
1条答案
按热度按时间wqsoz72f1#
这不起作用的原因是控制器是Rack中间件,需要通过请求来初始化。这也不是你应该首先编写或测试代码的方式。
控制器规范使用
get
,post
等方法,这些方法实际上创建了一个带有模拟请求的控制器示例。get :foo
将直接在控制器示例上调用foo
方法。您不需要直接初始化控制器。如果您想这样做,这是一个很好的迹象,表明您做错了什么。单元测试控制器是一种非常有缺陷的方法,RSpec和Rails团队都不鼓励这种方法--你在模仿应用程序的大部分内容,比如中间件和路由,这样会让很多bug通过你的测试。
测试Rails应用程序的现代方法是通过发送HTTP请求来测试控制器的 * 动作 *。这意味着你应该只测试实际上对应于一个路由的方法,并通过它提供的响应(头部和主体)以及最终的副作用来测试你的应用程序。在RSpec-rails中,这是通过请求、特性和系统规范来提供的。
控制器中的其他所有东西,比如这个方法,都应该是private的--并且不测试privates。