RSpec testing destroy controller action throws an error: ActionView::MissingTemplate

RSpec testing destroy controller action throws an error: ActionView::MissingTemplate

我正在为我的控制器编写测试,但我不断收到错误 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"

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

当控制器 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