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