2012-11-10 36 views
10

Cách tốt nhất để kiểm tra logic trong bố cục đường ray 3 là gì?Sử dụng RSpec để kiểm tra bố cục

Ví dụ: khi người dùng đăng nhập vào trang web của tôi, nếu họ chưa hoàn tất quy trình giới thiệu, tôi sẽ hiển thị cảnh báo ở đầu màn hình trên TẤT CẢ trang. Logic này được đặt vào bố cục ứng dụng. Tôi chỉ cần kiểm tra người dùng đã đăng nhập cho một khóa cụ thể. Nếu phím KHÔNG có mặt, tôi sẽ hiển thị cảnh báo. Ngay sau khi có chìa khóa (nghĩa là họ đã hoàn thành phần giới thiệu) Tôi KHÔNG hiển thị cảnh báo.

Hiện tại tôi đang cố gắng thực hiện điều này bằng kiểm tra chế độ xem nhưng tôi nhận được tất cả các loại lỗi ActionView::Template::Error: undefined method xác thực 'cho lỗi nilClass` bằng cách bao gồm bố cục ứng dụng và dường như tôi không thể kiểm tra tính năng này.

Tôi cần phải đảm bảo rằng tôi có thử nghiệm này bởi vì nếu vì lý do nào đó, một trong những nhà phát triển của tôi vô tình phá vỡ tính năng này (xem hiển thị với phần giới thiệu chưa hoàn chỉnh), chúng tôi cần biết ngay khi xây dựng.

Mã mà tôi đang cố gắng để kiểm tra trong cách bố trí của tôi trông như thế này:

<% if user_signed_in? %> 
    <% unless current_user.has_completed_onboarding? %> 
     <div class="alert"> 
     You cannot accept payments from your clients until you set up your payment gateway. 
     <%= link_to "Set up your", payment_gateway_path %> payment gateway. Its quick, we promise. :) 
     </div> 
    <% end %> 
<% end %> 

Tôi muốn chắc chắn rằng nếu họ tham gia hệ thống thông tin chi tiết chưa được cung cấp rằng thông điệp này sẽ hiển thị và nếu họ có được cung cấp, sau đó không hiển thị thông báo này.

Trả lời

14

Bạn có thể kiểm tra bố cục của mình giống như bất kỳ chế độ xem nào khác. Chỉ cần tạo một file application.html.erb_spec.rb (thay thế erb bởi haml nếu cần thiết) trong spec/views/layouts/, và trong tập tin đó viết lên thông số kỹ thuật của bạn như bình thường, ví dụ:

require 'spec_helper' 

describe 'layouts/application' do 

    context 'signed-in user' do 

    before { view.stub(:user_signed_in?) { true } } 

    context 'completed onboarding' do 

     before do 
     user = double('user') 
     user.stub(:has_completed_onboarding?) { false } 
     assign(:current_user, user) 
     end 

     it "should display alert" do 
     render 
     rendered.should have_selector('.alert') 
     end 

    end 

    ... 

    end 

    context 'signed-out user' do 
    ... 
    end 

    ... 

end 

Tôi làm điều này với một trong những ứng dụng của tôi và nó hoạt động không vấn đề, vì vậy tôi không thấy lý do tại sao nó sẽ không làm việc cho trường hợp của bạn.

2

Lỗi mà bạn nhận được ActionView::Template::Error: undefined method authenticate for nil:NilClass là do cuộc gọi phương thức user_signed_in? trong chế độ xem. Bạn có thể xử lý điều này bằng cách stubbing phương pháp user_signed_in? trong các thử nghiệm của bạn như @shioyama cho thấy trong mã.

Mã sau đây cho biết cách khai phương thức user_signed_in? và trả lại true nếu bạn muốn báo cáo if trong chế độ xem của bạn được thực hiện hoặc false nếu bạn không làm như vậy. view.stub(:user_signed_in?).and_return(true)

Các vấn đề liên quan