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代码的修改?
我也是 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。
| 归档时间: |
|
| 查看次数: |
1538 次 |
| 最近记录: |