Lưu ý: Tôi đã đọc câu hỏi và câu trả lời this, nhưng vì một số lý do mã không hoạt động đối với tôi. (xem bên dưới để biết lỗi tôi nhận được)Phương pháp tiêu diệt thử nghiệm RSpec (Hướng dẫn Rails 3.2 Ch. 9, Ví dụ 10)
Bài tập 10 từ Chương 9 của Hướng dẫn Rails yêu cầu bạn: Sửa đổi hành động phá hủy [đối với người dùng] để ngăn người dùng quản trị tự hủy. (Viết một bài kiểm tra đầu tiên.)
Phần khó khăn ở đây là thử nghiệm nó, vì ứng dụng đã ẩn liên kết "xóa" cho người dùng hiện tại, vì vậy bạn phải thực hiện yêu cầu http trực tiếp.
Tôi nhận mã hoạt động và thử nghiệm mã bằng cách xóa đoạn mã ẩn liên kết xóa cho người dùng hiện tại. Chắc chắn, nếu tôi nhấp vào liên kết xóa cho người dùng hiện đã đăng nhập, nó sẽ chuyển hướng tôi và cung cấp cho tôi thông báo thông báo.
Từ users_controller.rb
def destroy
@user = User.find(params[:id])
if current_user?(@user)
redirect_to users_path, notice: "You can't destroy yourself."
else
@user.destroy
flash[:success] = "User destroyed."
redirect_to users_path
end
end
Vấn đề tôi đang gặp là bằng văn bản cho các bài kiểm tra cho điều này mà sẽ gửi yêu cầu xóa và gọi phá hủy phương pháp. Tôi đã thử các giải pháp từ Rspec test for destroy if no delete link, mà tôi đang sao chép ở đây:
Từ user_pages_spec.rb
describe "destroy" do
let(:admin) { FactoryGirl.create(:admin) }
it "should not allow the admin to delete herself" do
sign_in admin
#expect { delete user_path(admin), method: :delete }.should change(User, :count)
expect { delete :destroy, :id => admin.id }.should_not change(User, :count)
end
end
Nhưng khi tôi chạy này, tôi nhận được lỗi này từ RSpec
Failures:
1) User Pages destroy should not allow the admin to delete herself
Failure/Error: expect { delete :destroy, :id => admin.id }.should_not change(User, :count)
ArgumentError:
bad argument (expected URI object or URI string)
# ./spec/requests/user_pages_spec.rb:180:in `block (4 levels) in <top (required)>'
# ./spec/requests/user_pages_spec.rb:180:in `block (3 levels) in <top (required)>'
Vì vậy, câu hỏi của tôi là: 1) Tại sao mã này ở trên không thành công? 2) Làm cách nào để mô phỏng "xóa" để gọi hành động hủy trong bộ điều khiển của tôi?
Môi trường: Mac OSX ruby 1.9.3p194 Rails 3.2.3
Gems để thử nghiệm:
nhóm: kiểm tra làm đá quý 'rspec-ray', '2.9.0' đá quý 'Capybara ',' 1.1.2 ' đá quý' rb-fsevent ',' 0.4.3.1 ',: require => false gem' growl ',' 1.0.3 ' gem' guard-spork ',' 0.3.2 ' 'spork' đá quý ',' 0.9.0 ' đá quý' factory_girl_rails ',' 1.4.0 ' kết thúc
Thông tin khác Tôi đã thử một số ton cách cố gắng mô phỏng nhấp vào liên kết xóa và không có cách nào hoạt động. Tôi đã sử dụng gem debugger để xem phương thức destroy có được gọi hay không. Trong bài kiểm tra đó nhấp chuột vào đường dẫn để xóa một người dùng khác nhau, phá hủy phương pháp được gọi và nó hoạt động tốt:
it "should be able to delete another user" do
expect { click_link('delete') }.to change(User, :count).by(-1)
end
Nhưng không có gì tôi đã cố gắng tạo ra yêu cầu xóa trực tiếp đã làm việc để gọi phá hủy phương pháp.
Cảm ơn sự giúp đỡ của bạn!
Will
** CẬP NHẬT **
Tôi cố gắng gợi ý DVG của:
describe "destroy" do
let(:admin) { FactoryGirl.create(:admin) }
it "should not allow the admin to delete herself" do
sign_in admin
#expect { delete user_path(admin), method: :delete }.should change(User, :count)
expect { delete :destroy, :id => admin }.to_not change(User, :count)
end
end
Và nhận lỗi này:
6) User Pages destroy should not allow the admin to delete herself
Failure/Error: expect { delete :destroy, :id => admin }.to_not change(User, :count)
ArgumentError:
bad argument (expected URI object or URI string)
# ./spec/requests/user_pages_spec.rb:190:in `block (4 levels) in <top (required)>'
# ./spec/requests/user_pages_spec.rb:190:in `block (3 levels) in <top (required)>'
SOLUTION
Tôi đã tìm ra sau FOREVER.
Tôi đã phải sử dụng Rack :: Test để đưa ra yêu cầu DELETE, nhưng Capybara và Rack :: Test không chia sẻ cùng một MockSession, vì vậy tôi đã phải lấy: remember_token và:! Sample_app_session cookie và đặt chúng vào yêu cầu DELETE theo cách thủ công. Đây là những gì đã làm việc. (Vấn đề khác mà tôi đã có, được liệt kê dưới đây, là tôi đã có một tuyên bố force_ssl mà không để cho hành động phá hoại của tôi được gọi.
describe "destroy" do
let!(:admin) { FactoryGirl.create(:admin) }
before do
sign_in admin
end
it "should delete a normal user" do
user = FactoryGirl.create(:user)
expect { delete user_path(user), {},
'HTTP_COOKIE' => "remember_token=#{admin.remember_token},
#{Capybara.current_session.driver.response.headers["Set-Cookie"]}" }.
to change(User, :count).by(-1)
end
it "should not allow the admin to delete herself" do
expect { delete user_path(admin), {},
'HTTP_COOKIE' => "remember_token=#{admin.remember_token},
#{Capybara.current_session.driver.response.headers["Set-Cookie"]}" }.
to_not change(User, :count)
end
end
Tôi đã có một tuyên bố force_ssl sau before_filters tôi trong users_controller.rb tôi và điều này được bằng cách nào đó ném vật tắt vì vậy tôi không bao giờ có hành động tiêu diệt.
class UsersController < ApplicationController
before_filter :signed_in_user, only: [:edit, :update, :index]
before_filter :existing_user, only: [:new, :create]
before_filter :correct_user, only: [:edit, :update]
before_filter :admin_user, only: :destroy
#force_ssl
def index
@users = User.paginate(page: params[:page])
end
def show
@user = User.find(params[:id])
@microposts = @user.microposts.paginate(page: params[:page])
end
def destroy
@user = User.find(params[:id])
if current_user?(@user)
redirect_to users_path, notice: "You can't destroy yourself."
else
@user.destroy
flash[:success] = "User destroyed."
redirect_to users_path
end
end
Đây là những hữu ích trong việc đến một giải pháp
https://gist.github.com/484787
http://collectiveidea.com/blog/archives/2012/01/05/capybara-cucumber-and-how-the-cookie-crumbles/
Một điều tôi chỉ phát hiện ra, đó không phải là vấn đề của tôi chính xác nhưng có thể được * một vấn đề * là phương pháp let là lười biếng, vì vậy tôi có thể tưởng tượng nó Screwing lên mong đợi to_not thay đổi chức năng. Vì vậy, tôi điều chỉnh mã để sử dụng cho phép! khi tạo người dùng quản trị. –
kịch bản bạn đang thử nghiệm là gì? Nhật ký quản trị trong, xóa liên kết bị ẩn, nhưng bằng cách nào đó, anh ấy đã xử lý yêu cầu xóa? (chỉ cần hỏi) –
Câu hỏi hay. Chủ yếu câu trả lời là đây là một bài tập trong Hướng dẫn Rails. Hóa ra đó là một bài tập tốt, bởi vì tôi đã học được mọi thứ về cookie, yêu cầu http, Capybara và Rack :: Test. Tôi cho rằng tôi có thể kiểm tra kịch bản mà mã để ẩn liên kết xóa không thành công và tôi muốn bộ điều khiển của mình có một bản sao lưu. –