Tôi không chắc chắn cách kiểm tra tin nhắn flash bằng các bài kiểm tra chức năng. Vấn đề của tôi có liên quan đến redirect_to
vì thử nghiệm của tôi cho số flash[:error]
KHÔNG vượt qua. Đây là những gì hành động create
của tôi trông giống như:Kiểm tra chức năng cho tin nhắn flash sau khi chuyển hướng
def create
@user = User.new(params[:user])
if @user.save
redirect_to @user, flash: { success: "Welcome!" }
else
flash.now[:error] = "Signup failed:"
render 'new'
end
end
Tôi có một bài kiểm tra qua cho flash[:error]
rằng 1) kiểm tra rằng flash[:error]
là giá trị đúng, 2) kiểm tra trang cho div flash, và 3) được một mới và kiểm tra xem thông báo flash đã bị xóa chưa. Tôi đã cố gắng để thực hiện một thử nghiệm tương tự cho flash[:success]
nhưng nó không thành công khi nó cố gắng tìm div trên trang. Đây là thử nghiệm không thành công:
should "show flash[:success] message" do
post :create, user: { name: "valid user",
password: "userpw",
password_confirmation: "userpw",
email: "[email protected]" }
assert_redirected_to user_path(assigns(:user)), "user isn't being redirected to their page after registration"
assert_equal flash[:success], "Welcome!", "flash[:success] isn't being set properly"
assert_select "div.alert-success", flash[:success]
get :new
assert flash.empty?, "there shouldn't be any flash messages left after getting new page"
end
Khi tôi kiểm tra thủ công trình duyệt này, trình duyệt hoạt động như mong đợi, nhưng tôi không chắc cách viết bài kiểm tra để phản ánh điều này. Hai xác nhận đầu tiên được chuyển đi (vì vậy kiểm tra nhận ra rằng nó đang được chuyển hướng chính xác và rằng flash[:success]
đang được đặt thành "Welcome!"
). Trên cơ sở đó, tôi sẽ nghĩ rằng tuyên bố assert_select
sẽ có thể tìm ra div, nhưng nếu thất bại với thông điệp này lỗi:
Expected at least 1 element matching "div.alert-success", found 0.
Vì vậy, tôi đã cố gắng thêm puts @response.body
ngay trước khi tuyên bố assert_select
, mà in này:
<html><body>You are being <a href="http://test.host/users/3">redirected</a>.</body></html>
Điều này giải thích lý do tại sao nó không thể tìm thấy flash div, nhưng tôi không chắc chắn cách "kết thúc" chuyển hướng để nó hiển thị chế độ xem chính xác với div flash. Nếu tôi thêm câu lệnh get
ngay trước câu lệnh assert_select
, bài kiểm tra sẽ trôi qua, vì bây giờ @response.body
có div flash. Tuy nhiên, điều này dường như không phải là một thử nghiệm hiệu quả vì nó không phản ánh hành vi của ứng dụng của tôi - người dùng không phải thực hiện một yêu cầu mới để xem thông báo flash.
Nó cũng không đảm bảo rằng thông báo flash hiển thị trên đúng trang. Nếu tôi sử dụng câu lệnh get :new
, xác nhận vẫn chuyển, ngụ ý rằng thông báo flash sẽ xuất hiện ở chế độ xem users#new
. Thậm chí nếu tôi sử dụng
get :show, id: assigns(:user).id
để đảm bảo tin nhắn nhấp nháy xuất hiện trên trang chính xác, điều này vẫn cảm thấy sai vì 1) bây giờ nó là một phản ứng success
thay vì một phản ứng redirect
, và 2) nó vẫn doesn' t giải thích lý do tại sao tôi đã tự yêu cầu bất kì trang để tìm div flash - theo docs "Đèn flash là một phần đặc biệt của phiên đó là xóa với mỗi yêu cầu"
Dù sao, là có một cách để kiểm tra xem thông báo flash có hiển thị chính xác sau khi chuyển hướng không?
Tôi gặp vấn đề tương tự. Tôi thấy rằng khi tôi chuyển hướng từ một hành động được gọi bằng cách làm cho nó hoạt động, nghĩa là assert_select có quyền truy cập vào chế độ xem được chuyển hướng, nhưng khi tôi chuyển hướng từ một hành động được gọi bằng 'post', nó chỉ thấy 'Bạn đang được chuyển hướng ...' trang. Rất phiền phức. Tôi đã cố gắng sử dụng follow_redirect! nhưng điều này không có sẵn trong các bài kiểm tra chức năng. –