ruby-on-rails - 为什么这个失败 'undefined method ` destroy' for nil :NilClass' rspec rails

标签 ruby-on-rails ruby rspec

这个测试的思路是处理没有找到记录的事件。那里不应该发生破坏行动,但它确实发生了。我对它进行了修改和修改,但本质上测试是正确的,所以我的代码中一定有问题。

RSpec.describe Admin::EntriesController, :type => :controller do

  setup_factories

  let(:model){ Photo }
  let(:instance){photo}
  let(:no_instances){no_photos}
  let(:some_instances){some_photos}
  let(:params_full_instance){params_full_photo}
  let(:params_new_instance){params_new_photo}

describe "delete destroy" do
      context "where the record is found" do
        before do
          allow(model).to receive(:where).and_return(some_instances)
          allow(some_instances).to receive(:first).and_return(instance)
        end
        context "where the record is destroyed" do
          before do
            allow(instance).to receive(:destroy).and_return(true)
            delete :destroy, params_id
          end
          sets_flash(:notice)
          redirects_to('/admin/entries/rejected')
        end
        context "where the record is not destroyed" do
          before do
            allow(instance).to receive(:destroy).and_return(false)
            delete :destroy, params_id
          end
          sets_flash(:error)
          redirects_to('/admin/entries/rejected')
        end
      end
      context "where the record is not found" do
        before do
          allow(model).to receive(:where).and_return(no_instances)
          delete :destroy, params_id

        end
        sets_flash(:error)
        redirects_to('/admin/entries/rejected')
      end

Controller

  before_action :get_entry_id, only: [:destroy, :toggle_approve_field, :toggle_reject_field]
    def destroy
       if @entry.nil?
          flash[:error] = "object is not not found"
        end
        if @entry.destroy
          flash[:notice] = 'blah'
          respond_to do |format|
            format.html { redirect_to rejected_admin_entries_path }
            format.json { head :no_content }
            format.js
          end
        else
          flash[:error] = 'There was a problem fetching the record'
          redirect_to rejected_admin_entries_path
        end
      end

    def get_entry_id
        if @entry.nil?
          flash[:error] = "object is not not found"
        end
        @entry = Photo.where(id: params[:id]).first
      end

我可能需要一双新的眼睛来看待它。以及关于我出错的很好的解释;)

更新:预期的行为是,当执行销毁操作但未找到记录时,我希望看到一个 flash 错误并被重定向。

更新 2:执行了下面的代码,仍然收到错误

 1) Admin::EntriesController for authenticated users delete destroy where the record is not found should set flash error
     Failure/Error: expect(flash[method]).to_not be_nil
       expected: not nil
            got: nil
     # -e:1:in `<main>'

  2) Admin::EntriesController for authenticated users delete destroy where the record is not found should redirect to /admin/entries/rejected
     Failure/Error: expect(response).to redirect_to(path)
       Expected response to be a <redirect>, but was <200>

谢谢 里科

最佳答案

你的问题是你还在尝试@entry.destroy,即使它仍然是零。

def destroy
  if @entry.nil?
    flash[:error] = "object is not not found"
  elsif @entry.destroy
    flash[:notice] = 'blah'
    respond_to do |format|
        format.html { redirect_to rejected_admin_entries_path }
        format.json { head :no_content }
        format.js
    end
  else
    flash[:error] = 'There was a problem fetching the record'
    redirect_to rejected_admin_entries_path
  end
end

关于ruby-on-rails - 为什么这个失败 'undefined method ` destroy' for nil :NilClass' rspec rails,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24761722/

相关文章:

ruby-on-rails - 如何在电子邮件中附加动态文件内容

ruby-on-rails-3 - 使用 rspec 测试 Rails 引擎助手

ruby-on-rails - Rails delay_job以HTML格式发送电子邮件

android - Ruby 和 Android 应用程序之间如何加密和解密数据?

ruby-on-rails - Form_for 的模型名称与 Controller 不同

ruby-on-rails - ruby rails : How to sort a collection_select

ruby-on-rails - 标题化连字符的名称

ruby-on-rails - 如何使用 rspec 测试 Cloudinary rails 和 Attachinary?

ruby - Rspec 中的条件测试?

ruby-on-rails - Bundler 正在从 Gemfile.lock 中删除 RUBY VERSION