2010-10-02 24 views
22

Tôi đã có một thử nghiệm chức năng sử dụng đồ đạc. Tôi cũng đang sử dụng đồ đạc trong bài kiểm tra Đơn vị của tôi, nhưng họ làm việc mà không có lỗ hổng. Khi chạy các bài kiểm tra chức năng, tôi nhận được một:Trong Rails 3, tôi nhận được NoMethodError cho việc tái chế! phương pháp trong khi thử nghiệm

NoMethodError: undefined method 'recycle!' for #<Response:0x10346be10> /test/functional/responses_controller_test.rb:10:in 'test_testing'

My kiểm tra chức năng, vào thời điểm này, đang làm gì khác hơn là một có được để action index. Ví dụ:

setup do 
    @response = responses(:one) 
end 

test "testing" do 
    get :index 
    assert true 
end 

Lớp TestHelper của tôi bao gồm tất cả các đồ đạc, vì vậy đồ đạc phản hồi chắc chắn đang tải. Và như tôi đã nói, các đồ đạc hoạt động hoàn toàn tốt trong các bài kiểm tra Đơn vị.

Bất kỳ ý tưởng nào có thể gây ra điều này?

Trả lời

44

Thay đổi

setup do 
    @response = responses(:one) 
end 

để

setup do 
    @myresponse = responses(:one) 
end 

và bạn tắt đi!

Vấn đề nằm ở chỗ "actionpack-3.0.1/lib/action_controller/test_case.rb" xung quanh dòng 386.

Các testcase giả định rằng @response giữ một "ActionDispatch :: Response". Bạn ghi đè lên nó, nó không có "ActionDispatch :: Response" nữa và testcase thất bại.

Tôi không chắc chắn đây có phải là hành vi dự định hay không.

Dù sao, chỉ cần đảm bảo bạn không ghi đè lên @ response/@ request/@ controller/@ routes và nó sẽ hoạt động.

+1

Cảm ơn, chỉ cần lưu thịt xông khói của tôi. Đã xảy ra sự cố tương tự với biến được gọi là @request. –

+0

Wow! Đã có chính xác mã giống như OP, và bây giờ tôi có chính xác mã giống như giải pháp của bạn! @flo – Ben

2

Flo của câu trả lời là chủ yếu là đúng, nhưng tôi chỉ muốn làm rõ:

Trong Rails 3.0.x rằng @request được kỳ vọng sẽ trở thành một loại ActionController::TestRequest, trong đó có các recycle! phương pháp xác định trên nó. Có TestResponse, TestRequestTestSession.

Bạn có thể thực sự muốn khởi tạo hoặc thao tác các đối tượng thuộc loại này trong một số trường hợp nhất định. Trong trường hợp của tôi, tôi cần phải giả lập trang web có tên miền cụ thể với

@request = ActionController::TestRequest.new unless @request 
@request.host = "www.hostname.com" 
2

Tôi vừa gặp sự cố tương tự khi đặt tên biến là @request. Tôi đã thay đổi thành @_request và giải quyết được sự cố.

+0

Cảm ơn. Điều này cũng đúng với '@ response'. – scarver2

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