2017-02-01 18 views
0

Say У меня есть константа, определенная в Grape::API классе:окурка константы в апи Grape тест 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 для конечной точки. Я хотел бы заглушить константу MAX_ALLOWED, так как я не хочу генерировать 50 тыс. Фиктивных данных.

Я попытался 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 

, и это также не работает.

EDIT: также опробовал allow вместо allow_any_instance_of с таким же результатом.

EDIT 2: вот недостаток спецификации:

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: с запросом в том же it колодке, stub_const (до сих пор не удается):

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 

Любой Идея, как заглушить константу, определенную в классе Grape::API для теста RSpec?

+0

вы можете попробовать 'allow (API :: V3 :: Resources :: Activities) .to получать (: MAX_ALLOWED) .and_return (1)'. Также у вас есть 2 имени переменных, один в вашем примере и один в ваших заглушках ... что это? – Anthony

+0

@ Энтони 'allow' не работал, к сожалению. И хороший улов (плохая копия/вставка), я просто обновил вопрос. – mmichael

ответ

0

Стабировка должна быть выполнена до вашего запроса. В этом случае вы можете поместить его в блок before над POST.

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