2014-12-16 2 views
0

Я пишу тест для проверки недействительных запросов DELETE на Rails API с использованием Rspec.Rails Тесты JSON API не возвращают json при вызове исключения

Это то, что у меня есть:

context 'invalid id number' do 
    it 'returns success: false' do 
     xhr :delete, :destroy, id: 999999999999999999 
     expect(JSON.parse(response.body)['success']).to be_false 
    end 
end 

Postgres бросает какую-то целого исключения переполнения (как это должно быть), но в моей спецификации я не могу смотреть на объект JSON, потому что он никогда не образуется. Как я могу заставить его возвращать {success: false} вместо пустой строки? Как заставить объект JSON вернуться, несмотря на исключение?

Когда я использую Поддеть, чтобы посмотреть на объект JSON, я получаю эту ошибку: JSON::ParserError: A JSON text must at least contain two octets! потому response.body оценивает пустую строку ""

Whoa, чуть не забыл включить код контроллера.

def destroy 
    if (site == ::MyModel.find(params[:id])) 
    site.destroy 
    render :json => {success: true} 
    else 
    render :json => {success: false} 
end 

ответ

1

Есть две проблемы:

  1. В зависимости от базы данных идентификатор «999999999999999999», вероятно, за пределами целого типа. Я рекомендую уменьшить его до нижеприведенного целочисленного предела, например 9999.

  2. Вы пытаетесь найти несуществующую запись и ее воссоздаете исключение record_not_found. Я рекомендую изменить способ уничтожить в:


def destroy 
    site = ::MyModel.find_by(id:params[:id]) 
    if (site.present?) 
    render :json => {success: false} 
    else 
    site.first.destroy 
    render :json => {success: true} 
    end 
end 

EDIT

@ rafb3 правильно find_by и present? является лучшим выбором.

+0

вы можете сохранить запрос с помощью 'find_by (id: ...)' и затем проверить 'site.present?'. Таким образом, вы избежите запуска запроса для 'empty?' – rafb3

1

По звукам ней вы будете нуждаться в какой-то спасательным заявление за исключением:

rescue ArithmeticException => ex 
    # We need to complete the contract and return json here 
    @response = { success: false } 
end 

Если вы хотите узнать больше о контрактах проверить это link

Помните, чтобы остаться вдали от возвращаемых объектов в ответах об отказе, как если бы вы отправили обратно что-то вроде site в этом случае, а site не существует или соединение с базой данных отсутствует, ваш код ответа на исключение может иметь свой собственный e xception!

Также попробуйте и держаться подальше от rescue Exception => e объяснения здесь: Why is it a bad style to `rescue Exception => e` in Ruby?

TLDR: Ваш запрос всегда ожидает ответа JSon так во всех местах, даже отказа он должен вернуть один.

Смежные вопросы