【问题标题】:RSpec testing destroy controller action throws an error: ActionView::MissingTemplateRSpec 测试销毁控制器操作会引发错误:ActionView::MissingTemplate
【发布时间】:2019-01-21 13:54:20
【问题描述】:

我正在为我的控制器编写测试,但我不断收到错误 ActionView::MissingTemplate。我已经查看了之前提出的相关问题,但我似乎无法让它适用于我的场景。

这是我的控制器代码:

def confirm_destroy
  render :layout => 'overlay'
end

def destroy
  @role.destroy
end

这是我写的测试:

describe 'DELETE #destroy' do
  let!(:role) { create(:role, user: current_user) }
  let(:params) { {id: role.id, format: :json} }

  it 'performs a delete' do
    expect { delete :destroy, params }.to change { Role.count }.by(-1)
  end
end

当我运行测试时出现错误:

 ActionView::MissingTemplate:
   Missing template company/settings/roles/destroy, application/destroy with {:locale=>[:en], :formats=>[:json], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :jbuilder, :slim]}. Searched in:
     * "/my_app/app/views"
     * "/usr/local/bundle/gems/devise-4.5.0/app/views"

知道为什么会这样吗?谢谢。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 rspec rspec-rails rspec3


    【解决方案1】:

    当控制器destroy 操作完成时,Rails 会尝试渲染一个默认模板(视图)并且它没有被定义,这意味着你没有文件my_app/app/views/company/settings/roles/destroy.json

    您有多种解决方法:

    1. 定义my_app/app/views/company/settings/roles/destroy.json,它将被渲染(不建议用于 JSON)。
    2. 重定向到其他操作,例如index(同样,不建议使用 JSON)。
    3. 渲染 json 或显式不渲染(见下文)

    --

    # render nothing:
    def destroy
      @role.destroy
      head :ok
    end
    
    # render json:
    # render nothing:
    def destroy
      @role.destroy
      render json: { deleted: true }, status: :no_content
    end
    

    【讨论】:

    • 在不改变控制器代码的情况下有没有办法测试出来?
    • 我会说你的测试在控制器中检测到一个错误,所以你应该修复它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多