2014-12-16 2 views
0

Rspec을 사용하여 Rails API에 유효하지 않은 DELETE 요청을 확인하는 테스트를 작성하고 있습니다.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 

포스트 그레스 (예상대로) 정수 오버 플로우 예외의 어떤 종류가 발생하지만,이 형성된 적이 있기 때문에 내 사양에 내가 JSON 객체를 볼 수 없습니다. 빈 문자열 대신 {success : false}를 반환하려면 어떻게해야합니까? 예외에도 불구하고 JSON 객체를 강제로 반환하려면 어떻게해야합니까? 내가 JSON 개체를보고 놀리려는를 사용하는 경우

, 나는이 오류가 : response.body가 빈 문자열 ""

워로 평가되므로 JSON::ParserError: A JSON text must at least contain two octets!가 거의 컨트롤러 코드를 포함하는 것을 잊었다. 그것의 소리에 의해

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

답변

1

두 여기에 문제가 있습니다 : 데이터베이스에 "999999999999999999"의 ID를 따라

  1. 정수 유형의 외부 아마도. 9999와 같은 부호가있는 정수 제한 이하로 줄이는 것이 좋습니다.

  2. 존재하지 않는 레코드를 찾고 record_not_found 예외를 발생 시키려고합니다. 나는 당신의 파괴 방법을 변경하는 것이 좋습니다 : rafb3 @


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 

편집

것은 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이 존재하지 않거나 데이터베이스 연결이 없다면 예외 응답 코드가 자신의 전자 메일을 가질 수 있습니다 xception!

또한 시도하고 멀리 여기 rescue Exception => e 설명에서 체재 : Why is it a bad style to `rescue Exception => e` in Ruby?

TLDR : 그것은 하나를 반환해야합니다 모든 장소도 실패 있도록 요청은 항상 JSON 응답을 기대하고있다.

관련 문제