2012-06-12 21 views
14

Tôi đang cố gắng kiểm tra nhánh bộ điều khiển Rails được kích hoạt khi phương thức mô hình tăng lỗi.Làm cách nào để khai báo một phương pháp để nâng lỗi bằng cách sử dụng Ruby MiniTest?

def my_controller_method 
    @my_object = MyObject.find(params[:id]) 

    begin 
    result = @my_object.my_model_method(params) 
    rescue Exceptions::CustomError => e 
    flash.now[:error] = e.message  
    redirect_to my_object_path(@my_object) and return 
    end 

    # ... rest irrelevant 
end 

Làm cách nào để nhận được thông báo lỗi tối thiểu để tăng lỗi này?

it 'should show redirect on custom error' do 
    my_object = FactoryGirl.create(:my_object) 

    # stub my_model_method to raise Exceptions::CustomError here 

    post :my_controller_method, :id => my_object.to_param 
    assert_response :redirect 
    assert_redirected_to my_object_path(my_object) 
    flash[:error].wont_be_nil 
end 

Trả lời

10

Một cách để làm điều này là sử dụng Mocha, Rails tải theo mặc định.

it 'should show redirect on custom error' do 
    my_object = FactoryGirl.create(:my_object) 

    # stub my_model_method to raise Exceptions::CustomError here 
    MyObject.any_instance.expects(:my_model_method).raises(Exceptions::CustomError) 

    post :my_controller_method, :id => my_object.to_param 
    assert_response :redirect 
    assert_redirected_to my_object_path(my_object) 
    flash[:error].wont_be_nil 
end 
+0

Nếu ngoại lệ có đối số, bạn phải cung cấp các ví dụ: '' 'MyObject.any_instance.expects (: my_model_method) .raises (Exceptions :: CustomError.new (some_arg))' '' – Tony

14
require "minitest/autorun" 

class MyModel 
    def my_method; end 
end 

class TestRaiseException < MiniTest::Unit::TestCase 
    def test_raise_exception 
    model = MyModel.new 
    raises_exception = -> { raise ArgumentError.new } 
    model.stub :my_method, raises_exception do 
     assert_raises(ArgumentError) { model.my_method } 
    end 
    end 
end 
+11

Mẹo chuyên nghiệp: Nếu phương pháp bạn đang stubbing để nâng cao một ngoại lệ có các tham số, bạn cần phải bao gồm các tham số trong lambda của bạn: raises_exception = -> (a, b, c) {raise ArgumentError.new}. – Brad

+0

Điều này phù hợp với tôi và IMO là câu trả lời được chấp nhận .. – egeland

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