【问题标题】:RSPEC not rendering JSON.jbuilder file (missing template error)RSPEC 未呈现 JSON.jbuilder 文件(缺少模板错误)
【发布时间】:2015-06-27 21:42:36
【问题描述】:

我正在使用 RSpec 测试我的 rails 应用程序,并且正在测试控制器。具体来说,我正在尝试渲染我的 jobs.json.jbuilder 视图文件。

我的控制器

class CustomersController < ApplicationController
  before_action :authenticate_member!
  before_action :set_customer


def jobs
    @jobs = @customer.jobs
end

我对应的视图位于: views/customers/jobs.json.jbuilder

我的 RSpec 测试是:

describe "GET job" do 
    it "renders the jobs view" do 
    get 'jobs', {id: @customer.id}, {format: :json}
    expect(response).to render_template("customers/jobs.json.jbuilder")
    end
end

但我不断收到的错误是:

     Failure/Error: get :jobs, {id: @customer.id}, {format: :json}
     ActionView::MissingTemplate:
       Missing template customers/jobs, application/jobs with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :jbuilder, :slim]}. Searched in:
         * "#<RSpec::Rails::ViewRendering::EmptyTemplatePathSetDecorator:0x007fa219178f78>"
     # ./spec/support/engine_controller.rb:25:in `process_action'
     # ./spec/support/engine_controller.rb:3:in `get'
     # ./spec/controllers/customers_controller_spec.rb:31:in `block (3 levels) in <top (required)>'

注意:如果我创建了一个jobs.html.erb 文件.. 那么这个错误就会消失,(它会呈现jobs.html.erb 文件) - 所以我的问题是如何呈现.json.jbuilder 视图?

这是我的spec/support/engine_controller 文件:

 module EngineController
   def get(action, parameters = nil, session = nil, flash = nil)
           process_action(action, parameters, session, flash, "GET")
   end 

    private
       def process_action(action, parameters = nil, session = nil, flash =       nil, method = "GET")
        parameters ||= {}
        process(action, method, parameters.merge!(:use_route => :my_engine_name), session, flash, )
      end

【问题讨论】:

    标签: ruby-on-rails json rspec controller jbuilder


    【解决方案1】:

    使用以下语法修复了问题:

    describe "GET job" do 
      it 'renders the jobs view' do 
        get 'jobs', { id: @customer.id, format: :json }
        expect(response).to render_template("customers/jobs")
      end
    end
    

    【讨论】:

      【解决方案2】:

      这是一个很晚的答案,但是,对于那些仍在回答这个问题的人......

      为了默认渲染json.jbuilder,你应该把它放在routes.rb上

      在这种情况下...

      resources :costumers, defaults: { format: :json }, only: [...] do
        get 'job', to: 'costumers#job'
      end
      

      【讨论】:

        【解决方案3】:

        值得注意的是添加

        config.render_views = true
        

        Rails_helper 中的 RSpec.configure 也是需要的

        根据stackoverflow answer

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-05-05
          • 2011-11-22
          • 2012-02-11
          • 2015-09-08
          • 1970-01-01
          • 2015-09-08
          • 1970-01-01
          相关资源
          最近更新 更多