我正在从Rails教程第9章开始练习9:http://ruby.railstutorial.org/chapters/updating-showing-and-deleting-users#fnref-9_9 "修改销毁操作以防止管理员用户破坏自己。 (先写一个测试。)"
我开始创建测试: users_controller_spec.rb
require 'spec_helper'
describe UsersController do
describe "admins-userscontroller" do
let(:admin) { FactoryGirl.create(:admin) }
let(:non_admin) { FactoryGirl.create(:user) }
it "should not be able to delete themself" do
sign_in admin
expect { delete :destroy, :id => admin.id }.not_to change(User, :count)
end
end
end
然而,注意到即使没有实现禁止管理员删除自己的逻辑,测试也会通过,除非我改变行
sign_in admin
到
sign_in admin, no_copybara: true
此更改测试失败后(如预期的那样)
sign_in位于support \ utilities.rb文件中,如下所示:
def sign_in(user, options={})
if options[:no_capybara]
# Sign in when not using Capybara.
remember_token = User.new_remember_token
cookies[:remember_token] = remember_token
user.update_attribute(:remember_token, User.hash(remember_token))
else
visit signin_path
fill_in "Email", with: user.email
fill_in "Password", with: user.password
click_button "Sign in"
end
end
有谁知道它为什么不与水豚合作?它看起来像" else"上面代码的部分在使用水豚时失败/没有执行,但它没有返回任何错误(例如,#34; Email"字段未找到,所以它看起来像是' s渲染)...
其他问题是,如果我删除non_admin而不是admin:
expect { delete :destroy, :id => non_admin.id }.not_to change(User, :count)
测试通过,这意味着non_admin不会被删除...为什么它适用于admin而不是non_admin?
问题2: capybara不应该在2.0+的请求规范中工作,但我使用capybara 2.1和rspec-rails 2.13.1并且它在请求规范中工作得很好(实际上甚至是教程告诉我们要做的),甚至没有输出任何警告......