2012-01-12 20 views
5

Tôi tự hỏi làm thế nào để xác nhận người dân địa phương thông qua để render mẫu trong điều khiểnLàm thế nào để xác nhận người dân địa phương về làm mẫu trong rspec

Bộ điều khiển:

def lelf_panel 
    # ... 
    if some_condition 
    locals_hash = some_very_long_hash_A 
    else 
    locals_hash = some_very_long_hash_B 
    end 
    render :partial => "left_panel", :layout => false, :locals => locals_hash 
end 

hiện Spec:

it 'should render correct template for lelf_panel' do 
    # ... 
    get 'left_panel' 
    response.should render_template('system/_left_panel') 
end 

Bây giờ tôi cần phải hoàn thành Rcov cho bộ điều khiển này vì vậy tôi cần phải thêm/sửa đổi spec để bao gồm cả hai 'some_condition' kết quả. và tôi muốn xác thực 'lelf_panel' người dân địa phương được truyền để hiển thị, như thể tôi chỉ xác thực render_template, một phần trang được hiển thị cho cả hai kết quả giống nhau.

tôi kiểm tra 'render_template' trong tài liệu rspec trong http://rubydoc.info/gems/rspec-rails/2.8.1/RSpec/Rails/Matchers/RenderTemplate:render_template

nó chỉ cung cấp và params 2 trong tổng số tin nhắn, vậy làm thế nào tôi có thể kiểm tra người dân địa phương thông qua để render?

Trả lời

1

theo như tôi biết, không có cách nào để trực tiếp kiểm tra người dân địa phương cho một mẫu theo cách bạn mô tả.

Bạn có thể thay đổi locals_hash thành @locals_hash và sau đó kiểm tra kết quả thông qua việc gán (: locals_hash). Hoặc, bạn có thể sử dụng bộ chọn trên HTML kết quả và kiểm tra xem có một số nội dung chỉ định không - ví dụ: nếu locals_hash ảnh hưởng đến tiêu đề của trang, hãy kiểm tra xem tiêu đề trang HTML có phải là những gì bạn mong đợi hay không.

14

Thay vì sử dụng đối sánh render_template, bạn có thể sử dụng kỳ vọng trên đối tượng bộ điều khiển.

it 'should render correct template for lefl_panel' do 
    # ... 
    allow(controller).to receive(:render).with no_args 
    expect(controller).to receive(:render).with({ 
    :partial => 'system/_left_panel', 
    :layout => false, 
    :locals => some_very_long_hash_A 
    }) 
    get 'left_panel' 
end 
+0

này làm việc cho tôi - nhưng chỉ sau khi tôi đặt lệnh get SAU bình luận should_receive, và tôi cũng cần thêm controller.stub (: render) để tránh lỗi - nhưng tôi không chắc tại sao .... – Phantomwhale

+1

Đây là câu trả lời vượt trội. Thay đổi một ứng dụng để phù hợp với nhu cầu của một thư viện thử nghiệm là một mùi mã. – user94154

+0

@Phantomwhale Tôi vừa gặp lỗi bạn gặp phải. Vấn đề là kỳ vọng của chúng tôi không hiển thị hoặc chuyển hướng bất kỳ thứ gì, vì vậy hiển thị mặc định được gọi ở cuối hành động. Điều đó được sử dụng tốt với rspec, nhưng bây giờ là một kỳ vọng chưa được đáp ứng. –

1

Tương tự như @ 's câu trả lời với lời đề nghị từ @ user2490003' ryan-Ahearn s bình luận - nhưng tất cả đưa vào một cái gì đó linh hoạt hơn và cho RSpec 3.

# Safe to set globally, since actions can either render or redirect once or fail anyway 
    before do 
    allow(controller).to receive(:render).and_call_original 
    end 

    describe "get left panel" do 
    before do 
     # other setup 
     get 'left_panel' 
    end 

    it 'should render correct template for lelf_panel' do 
     # Sadly, render_template is primitive (no hash_including, no block with args, etc.) 
     expect(subject).to render_template('system/_left_panel') 
    end 

    it 'should render with correct local value' do 
     expect(controller).to have_received(:render) do |options| 
     expect(options[:locals][:key_from_very_long_hash]).to eq('value_of_key_from_very_long_hash') 
     end 
    end 
    end 
+0

Tôi thấy cái này hữu ích nhất, tuy nhiên, tôi đã phải thay đổi chữ ký khối, ít nhất là trong phiên bản đường ray của tôi (3.2, đừng hỏi;) nó chuyển tên của phương thức được hiển thị. Ví dụ trong bộ điều khiển của tôi, tôi có 'render" index, locals: {presenter: presenter} 'và trong spec của tôi bây giờ tôi có' expect (controller) .to have_received (: render) do | _method, options | '.. phần còn lại là như nhau. –

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