Ruby教程Ch9练习#9 - 不允许管理员删除自己

Sco*_*ynn 6 tdd ruby-on-rails-3 railstutorial.org

我是Ruby和Rails的新手,这就是为什么我要通过Michael Hartl的Rails教程.我被困在第9章,练习#9.我已将用户控制器中的def destroy代码更新为:

def destroy
  user = User.find(params[:id])
  if (current_user == user) && (current_user.admin?)
    flash[:error] = "Can not delete own admin account!"
  else
    user.destroy
    flash[:success] = "User destroyed."
  end
redirect_to users_path
end
Run Code Online (Sandbox Code Playgroud)

当我在浏览器中测试时,通过在管理员登录时向current_user添加"删除"链接,这似乎有效.但是练习说先写一个测试 - 我做了但似乎没有用.这是我测试的内容:

describe "as admin user" do
  let(:user_admin) { FactoryGirl.create(:admin) }

  before { sign_in user_admin }

  describe "submitting a DELETE request to destroy own admin account" do
    before { delete user_path(user_admin) }
    it { should have_selector('div.alert.alert-error', text: 'delete own admin') }
  end
end
Run Code Online (Sandbox Code Playgroud)

也许我测试的不应该被测试.如何测试用户控制器中def def代码的修改?

ebl*_*ume 1

我也是 Rails 教程(以及一般 Rails)的新手,也遇到了同样的问题,你的问题帮助我找到了答案。

我仍然不确定为什么你的代码会失败,但以下步骤确实有效。

首先,稍微修改测试代码以使用以下结构(这里我省略了放置此描述块的位置 - 您已经有了正确的位置):

describe "deleting herself" do
  it "should not be possible" do
    expect { delete user_path(admin) }.to_not change(User, :count).by(-1)
  end
end
Run Code Online (Sandbox Code Playgroud)

请注意,我使用 Expect{} 块来跟踪 User 对象的数量。这肯定会导致测试变成红色(这在这一点上很好),而检查闪存会使测试变成红色,但检查错误闪存似乎在这里不起作用。我真的不知道为什么!也许与发生的双重重定向有关?

接下来,编写保护代码以使测试再次变绿。你的代码可以工作(我认为),但我认为我的代码更惯用一点,因为它使用了第 9 章前面定义的会话助手。

def destroy
  user = User.find(params[:id])
  if (current_user? user) && (current_user.admin?)
    flash[:error] = "You are not allowed to delete yourself as an admin."
  else
    user.destroy
    flash[:success] = "User destroyed. ID: #{user.id}"
  end
  redirect_to users_path
end
Run Code Online (Sandbox Code Playgroud)

这一更改使我的测试再次变为“绿色”,从而成功完成了练习 10。