2017-02-01 10 views
0

가 나는 Grape::API 클래스에 정의 된 상수를 가지고 말에서 일정한에게 : 스텁 포도 API를 RSpec에 테스트

class Activities < Grape::API 
    MAX_ALLOWED = 50000 
    ... 
end 

그리고 엔드 포인트 desc에서

:

params do 
    requires :data, type: Array, allow_blank: false, array_length: MAX_ALLOWED 
end 

내가 스펙을 작성하려는 (RSpec 사용)을 사용하여 엔드 포인트에 대한 array_length 옵션을 테스트하십시오. 실제로 더미 데이터를 50k 생성하고 싶지 않기 때문에 MAX_ALLOWED 상수를 스텁하고 싶습니다.

나는

stub_const(API::V3::Resources::Activities::MAX_ALLOWED, 3)을 시도했지만 오류가있어 : NoMethodError: undefined method 'sub' for 40000:Fixnum

가 나는 또한

stub_const('API::V3::Resources::Activities::MAX_ALLOWED', 3)을 시도했지만 그건 그냥 작동하지 않았다입니다.

before do 
    allow_any_instance_of(API::V3::Resources::Activities).to receive(:MAX_ALLOWED).and_return(1) 
end 

을하고 또한 작동하지 않았다 :

마지막으로, 나는 시도했다.

편집 : 또한 allow_any_instance_of 대신에 을 시도했습니다.

EDIT 2

it 'returns a 400' do 
    stub_const('API::V3::Resources::Activities::MAX_ALLOWED', 3) # this doesn't work 
    contacts_api :post, "#{uri}#{resource}", request.to_json, options 
    expect(response.status).to eq(400) 
    expect(resp_body['error_key']).to eq('contacts.api.bad_request') 
    expect(resp_body['error_message']).to eq('too many contacts') 
end 

상관 다음 stub_const (계속 실패) 같은 it 블록 내의 요청 :

context 'with more than 50,000 contacts' do 
    let(:options) {{ 'CONTENT_TYPE' => 'application/json' }} 

    # contacts_api, uri, resource, and request are defined elsewhere 
    before { contacts_api :post, "#{uri}#{resource}", request.to_json, options } 

    # Also tried this instead of stub_const: 
    # before do 
    # allow_any_instance_of(API::V3::Resources::Activities).to receive(:MAX_ALLOWED).and_return(1) 
    # end 

    it 'returns a 400' do 
    stub_const('API::V3::Resources::Activities::MAX_ALLOWED', 3) 
    expect(response.status).to eq(400) 
    expect(resp_body['error_key']).to eq('api error') 
    expect(resp_body['error_message']).to eq('too many contacts') 
    end 
end 

EDIT 3 : 여기는 실패한 사양의 RSpec 테스트를 위해 Grape::API 클래스에 정의 된 상수를 스텁하는 방법은 무엇입니까?

+0

allow (API :: V3 :: Resources :: Activities) .to (: MAX_ALLOWED) .and_return (1)'을 시도해 볼 수 있습니까? 또한 변수 이름이 2 개 있는데, 하나는 예제에, 다른 하나는 스텁에 있습니다. 그게 무엇입니까? – Anthony

+0

@Anthony'allow'는 불행하게도 작동하지 않았습니다. 그리고 좋은 캐치 (나쁜 사본/붙여 넣기), 나는 방금 질문을 업데이 트했습니다. – mmichael

답변

0

요청 전에 스터 빙을 수행해야합니다. 이 경우 POST 위의 before 블록에 넣을 수 있습니다.

before { stub_const('API::V3::Resources::Activities::MAX_ALLOWED', 3) } 
before { contacts_api :post, "#{uri}#{resource}", request.to_json, options } 
+0

고맙습니다.하지만 실패한 시도 중 하나로 기록했습니다. – mmichael

+0

@mmichael : 문자열'API :: V3 :: Resources :: Activities :: MAX_CONTACTS_COUNT "가 아닌 API :: V3 :: Resources :: Activities :: MAX_CONTACTS_COUNT'의 결과를 전달 중입니다. – fylooi

+0

다른 클래스 내 질문 좀 봐 - 나는'stub_const ('API :: V3 :: Resources :: Activities :: MAX_ALLOWED', 3)'문자열로 시도했다. – mmichael