2012-09-21 22 views
5

Tôi có một trình trợ giúp truy cập request.fullpath. Trong thử nghiệm trợ giúp độc lập, request không khả dụng. Tôi nên làm gì? Tôi có thể bằng cách nào đó chế giễu nó hoặc một cái gì đó như thế?Đường ray: kiểm tra trình trợ giúp cần truy cập vào môi trường Rails (ví dụ: request.fullpath)

Tôi đang sử dụng phiên bản Rails và RSpec mới nhất. Đây là những gì giúp đỡ tôi trông giống như:

def item(*args, &block) 
    # some code 

    if request.fullpath == 'some-path' 
    # do some stuff 
    end 
end 

Vì vậy, các dòng mã có vấn đề là # 4 nơi helper cần truy cập vào các đối tượng request mà không có sẵn trong spec helper.

Cảm ơn rất nhiều sự trợ giúp.

+0

Bạn đã "require 'rspec/đường ray" trong spec_helper.rb của bạn? – Rubyman

+0

Vâng, tôi có. Cảm ơn. –

Trả lời

4

Có, bạn có thể thử các yêu cầu. Tôi đã có một câu trả lời dài toàn bộ ở đây mô tả làm thế nào để làm điều đó, nhưng trên thực tế đó không nhất thiết phải là những gì bạn muốn.

Chỉ cần gọi phương thức trợ giúp của bạn trên đối tượng trợ giúp trong ví dụ của bạn. Giống như vậy:

describe "#item" do 
    it "does whatever" do 
    helper.item.should ... 
    end 
end 

Điều đó sẽ cho phép bạn truy cập đối tượng yêu cầu thử nghiệm. Nếu bạn cần phải xác định một giá trị cụ thể cho đường dẫn yêu cầu, bạn có thể làm như vậy như thế này:

before :each do 
    helper.request.path = 'some-path' 
end 

Trên thực tế, cho đầy đủ, hãy để tôi bao gồm câu trả lời ban đầu của tôi, vì tùy thuộc vào những gì bạn đang cố gắng để làm điều đó vẫn có thể hữu ích.

Đây là cách bạn có thể thử các yêu cầu:

request = mock('request') 
controller.stub(:request).and_return request 

Bạn có thể thêm các phương pháp còn sơ khai để yêu cầu quay trở lại tương tự

request.stub(:method).and_return return_value 

Và cú pháp thay thế để thử & còn sơ khai tất cả trong một dòng:

request = mock('request', :method => return_value) 

Rspec sẽ khiếu nại nếu giả của bạn nhận được messa ges mà bạn không stub. Nếu có những thứ khác Chỉ cần gọi phương thức trình trợ giúp yêu cầu của bạn trên đối tượng trợ giúp đang làm mà bạn không quan tâm trong bài kiểm tra của mình, bạn có thể tắt rspec bằng cách tạo giả lập một "đối tượng rỗng", ví dụ. như Giống như rất

request = mock('request').as_null_object 

Dường như tất cả các bạn có thể cần phải nhận được qua thử nghiệm cụ thể của bạn là thế này:

describe "#item" do 
    let(:request){ mock('request', :fullpath => 'some-path') } 

    before :each do 
    controller.stub(:request).and_return request 
    end 

    it "does whatever" 
end 
+0

Bỏ qua câu trả lời trước của tôi. Nó mô tả cách giả lập đối tượng yêu cầu, nhưng đó không nhất thiết phải là cách đúng để có được những gì bạn muốn trong một đặc tả trợ giúp. Xem ở trên. – gregates

+0

Cảm ơn rất nhiều, nó hoạt động như một sự quyến rũ. Tuy nhiên, tôi là một chút không chắc chắn, tại sao nó. Cuộc gọi trực tiếp tới 'helper.my_method' có giống với lệnh gọi' my_method' đơn giản không? Khi kiểm tra người trợ giúp, tôi có nên luôn gọi họ trên đối tượng 'helper' không?Có một đối tượng tương tự cho các bộ kiểm tra và kiểm tra xem không? –

+1

Có! có rất nhiều điều thú vị bạn có thể thực hiện với bộ điều khiển ẩn danh; rspec-rails cung cấp cho bạn một đối tượng 'controller' kế thừa từ ApplicationController, và bạn có thể định nghĩa các hành động stub trên nó để kiểm tra before_filters hoặc bất cứ thứ gì khác. Thành thật mà nói, tôi không chắc tôi đủ chuyên gia để giải thích tại sao bạn cần gọi phương thức của bạn trên đối tượng 'helper'. Tôi muốn khuyên bạn nên nghiên cứu các tài liệu rspec tại https://www.relishapp.com/rspec/rspec-rails/v/2-11 nếu bạn muốn tìm hiểu thêm. – gregates

0

Trong một spec helper, bạn có thể truy cập theo yêu cầu sử dụng controller.request (vì vậy controller.request.stub(:fullpath) { "whatever" } nên làm việc)

+0

Cảm ơn bạn, nhưng điều này dường như không làm cho đối tượng 'request' có sẵn trong trình trợ giúp (đó là vấn đề). –

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