ruby-on-rails Ruby on Rails Rspec未定义方法主机错误

oymdgrw7  于 2022-11-19  发布在  Ruby
关注(0)|答案(1)|浏览(204)

当我尝试将测试写入控制器中的方法时,我收到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是零。

wqsoz72f

wqsoz72f1#

这不起作用的原因是控制器是Rack中间件,需要通过请求来初始化。这也不是你应该首先编写或测试代码的方式。
控制器规范使用getpost等方法,这些方法实际上创建了一个带有模拟请求的控制器示例。get :foo将直接在控制器示例上调用foo方法。您不需要直接初始化控制器。如果您想这样做,这是一个很好的迹象,表明您做错了什么。
单元测试控制器是一种非常有缺陷的方法,RSpec和Rails团队都不鼓励这种方法--你在模仿应用程序的大部分内容,比如中间件和路由,这样会让很多bug通过你的测试。
测试Rails应用程序的现代方法是通过发送HTTP请求来测试控制器的 * 动作 *。这意味着你应该只测试实际上对应于一个路由的方法,并通过它提供的响应(头部和主体)以及最终的副作用来测试你的应用程序。在RSpec-rails中,这是通过请求、特性和系统规范来提供的。
控制器中的其他所有东西,比如这个方法,都应该是private的--并且不测试privates。

相关问题