2009-11-26 30 views
10

Tôi đang cố gắng kiểm tra quan điểm của mình với RSpec. Quan điểm cụ thể mà là gây cho tôi phiền thay đổi diện mạo của nó tùy thuộc vào một tham số url:Kiểm tra xem RSpec: Cách sửa đổi thông số?

link_to "sort>name", model_path(:sort_by => 'name') mà kết quả trong http://mydomain/model?sort_by=name

Quan điểm của tôi sau đó sử dụng tham số này như thế:

<% if params[:sort_by] == 'name' %> 
<div>Sorted by Name</div> 
<% end %> 

các RSpec trông giống như này:

it "should tell the user the attribute for sorting order" do 
    #Problem: assign params[:sort_for] = 'name' 
    render "/groups/index.html.erb" 
    response.should have_tag("div", "Sorted by Name") 
end 

Tôi muốn kiểm tra chế độ xem (không có bộ điều khiển) trong RSpec nhưng tôi không thể có được thông số này er vào biến số params của tôi. Tôi cố gắng assign trong tất cả các hương vị khác nhau:

  • assign[:params] = {:sort_by => 'name'}
  • assign[:params][:sort_by] = 'name'
  • ...

không thành công cho đến nay. Mọi ý tưởng đều được đánh giá cao.

Trả lời

10

Đó là vì bạn không nên sử dụng params trong chế độ xem của mình.
Cách tốt nhất tôi thấy nó để sử dụng trợ giúp.

<div>Sorted by <%= sorted_by %></div> 

Và trong một trong các file helper bạn

def sorted_by 
    params[:sorted_by].capitalize 
end 

Sau đó, bạn có thể kiểm tra những người giúp đỡ bạn khá dễ dàng (vì trong các thử nghiệm giúp đỡ, bạn có thể xác định các yêu cầu params.

+0

Không phải những gì tôi mong đợi, nhưng nó đã giải quyết được vấn đề của tôi và cải thiện ứng dụng của tôi. Cảm ơn! – sebastiangeiger

33

Nếu nó một bộ điều khiển kiểm tra sau đó nó sẽ là

controller.stub!(:params).and_return {} 

Nếu kiểm tra trình trợ giúp của nó thì nó sẽ e:

helper.stub!(:params).and_return {} 

Và thử nghiệm một cái nhìn của nó sẽ là:

view.stub!(:params).and_return {} 

Nếu bạn nhận được cảnh báo như dưới đây.

Deprecation Warnings: 

Using `stub` from rspec-mocks' old `:should` syntax without explicitly enabling the syntax is deprecated. Use the new `:expect` syntax or explicitly enable `:should` instead. Called from /home/akbarbin/Documents/Office/projects/portfolio/spec/views/admin/waste_places/new.html.erb_spec.rb:7:in `block (2 levels) in <top (required)>'. 


If you need more of the backtrace for any of these deprecations to 
identify where to make the necessary changes, you can configure 
`config.raise_errors_for_deprecations!`, and it will turn the 
deprecation warnings into errors, giving you the full backtrace. 

1 deprecation warning total 

Finished in 4.86 seconds (files took 4.72 seconds to load) 

Bạn có thể thay đổi nó thành

allow(view).to receive(:params).and_return({sort_by: 'name'}) 
+0

Tôi thấy điều này hữu ích, nhưng tôi đã sử dụng cú pháp Rspec 3: 'allow (view) .to receive (: params) .and_return ({action: 'index'})' –

5

Cách dễ dàng là chỉ cần làm điều này:

helper.params = {:foo => '1', :bar => '2'} 

Nhưng nói chung nó tốt hơn để có nhiều hội nhập-y và không "sơ khai "giá trị khi nó khả thi. Vì vậy, tôi thích sử dụng các kiểm tra bộ điều khiển với integration_views. Sau đó, bạn có thể chỉ định các thông số của mình cho số nhận được và kiểm tra toàn bộ luồng hoạt động, từ việc gửi các tham số đến bộ điều khiển, để chúng được xử lý bởi bộ điều khiển và cuối cùng là hiển thị.

Tôi cũng thường muốn đưa ra chế độ xem logic vào trình trợ giúp, có thể dễ dàng kiểm tra hơn.

Ví dụ, nói rằng tôi có một helper gọi selection_list, mà trả về một Hash mà "selected_preset" chìa khóa dựa vào params [: selected_preset], và mặc định là 42 nếu một giá trị rỗng được quy định cho các param.

Dưới đây là kiểm tra bộ điều khiển mà chúng tôi đã gọi là integration_views (bạn có thể làm điều tương tự với thử nghiệm chế độ xem thực tế, nếu bạn tham gia vào đó).

describe '#show' do 
    describe 'selected_preset' do 
    it 'should default to 42 if no value was entered' do 
     get :show, :params => {:selected_preset => ''} 
     response.template.selection_list[:selected_preset].should == 42 

Kiểm tra tích hợp này sẽ cảnh báo cho tôi nếu một phần chức năng này bị hỏng. Nhưng tôi cũng lý tưởng muốn có một số thử nghiệm đơn vị để giúp tôi pinpoint sự cố đó bị vỡ.

Tôi sẽ bắt đầu bằng cách giúp người trợ giúp sử dụng biến mẫu thay vì truy cập trực tiếp các thông số. Tôi sẽ thay đổi mã trên bằng cách thêm một dòng duy nhất ngay bên dưới get, như sau:

describe '#show' do 
    describe 'selected_preset' do 
    it 'should default to 42 if no value was entered' do 
     get :show, :params => {:selected_preset => ''} 
     assigns[:selected_preset].should == 42 # check instance variable is set 
     response.template.selection_list[:selected_preset].should == 42 

Bây giờ tôi cũng có thể dễ dàng thực hiện một thử nghiệm đơn vị helper:

describe MyHelper do 
    describe '#selection_list' do 
    it 'should include the selected preset' do 
     assigns[:selected_preset] = 3 
     helper.selection_list[:selected_preset].should == 3 
+0

Có vẻ như "integration_views" hiện không còn được ưa chuộng của "render_views". https://relishapp.com/rspec/rspec-rails/v/2-1/docs/controller-specs/render-views –

1

Một phương pháp thiết lập xem params:

controller.request.path_parameters[:some_param] = 'a value' 
Các vấn đề liên quan