2016-06-17 3 views
0

У меня возникла проблема с тестированием некоторой ветреной логики json.erb. Ниже Еврорадио шаблон создает нужный файл в формате JSON:ruby, rspec и json.erb: модульное тестирование шаблона JSON

fig1:

"api": { 
<% unless @GLANCE_IMAGE_API_WORKERS_NUM.nil? %> 
    "workers": <%= @GLANCE_IMAGE_API_WORKERS_NUM %> 
<% if @GLANCE_BACKEND == 'ceph' %> 
    <% unless @GLANCE_IMAGE_API_WORKERS_NUM.to_s.empty? %>,<% end %> 
    "default_store": "rbd" 
<% end %> 
<% if [email protected]_CACHE_MAX_SIZE.to_s.empty? %> 
    <% unless @GLANCE_IMAGE_API_WORKERS_NUM.to_s.empty? && @GLANCE_BACKEND != 'ceph' %>,<% end %> 
    "cache" : { 
    "image_cache_max_size": <%= @IMAGE_CACHE_MAX_SIZE %> 
    } 
<% end %> 

Чтобы построить JSON он добавляет отставая запятые, если и когда они необходимы. Например, если glance_backend установлен в «Ceph», запятой требуется после glance.image.api_workers, чтобы на следующую запись и сделать правильный JSON - пример:

Рис 2.

"api": { 
      "workers": 8, 
      "cache": { 
      "image_cache_max_size": 10000000000 
      } 
     }, 

Пытаюсь чтобы проверить все возможные сценарии для логики на рис 1. Я считаю, что они будут что-то вроде этого (псевдо-код):

  • если image_cache_max_size != empty && glance_backend == 'ceph' && glance_image_api_workers == "not_empty", добавьте запятую после ввода default_store, чтобы позволить следующему пункту;

  • если image_cache_max_size != empty && glance_backend == 'ceph' && glance_image_api_workers == "", no trailing comma;

  • если image_cache_max_size != empty && glance_backend == 'not_ceph' && glance_image_api_workers == "not_empty", no trailing comma;

  • если image_cache_max_size != empty && glance_backend == 'ceph' && glance_image_api_workers == "", нет trailing запятая.

До сих пор моя RSpec логика выглядит следующим образом - fig3:

context 'comma appended to "glance.api.workers" in correct circumstances' do 

    before do 
     data_bag['IMAGE_CACHE_MAX_SIZE'] = 10000 
     data_bag['GLUSTER_BACKEND'] = 'ceph' 
     data_bag['GLUSTER_IMAGE_API_WORKERS'] = 'not_empty' 
    end 

    it 'sets default_store attributes' do 
     expect(override_attr['openstack']['image']['api']['workers']) 
     .to include(",") 
    end 

    before do 
     data_bag['IMAGE_CACHE_MAX_SIZE'] = 10000 
     data_bag['GLUSTER_BACKEND'] = 'local' 
     data_bag['GLUSTER_IMAGE_API_WORKERS'] = '' 
    end 

    it 'sets default_store attributes' do 
     expect(override_attr['openstack']['image']['api']['workers']) 
     .to_not include(",") 
    end 

    before do 
     data_bag['IMAGE_CACHE_MAX_SIZE'] = 10000 
     data_bag['GLUSTER_BACKEND'] = 'local' 
     data_bag['GLUSTER_IMAGE_API_WORKERS'] = 'not_empty' 
    end 

    it 'sets default_store attributes' do 
     expect(override_attr['openstack']['image']['api']['workers']) 
     .to_not include(",") 
    end 
    end 

Это может быть совершенно неправильный способ пойти об этом. С нетерпением ждем некоторых предложений. Благодарю.

ответ

1

Предлагаю использовать y0 jbuilder gem. Он позволяет создавать любые действующие структуры JSON, которые вы хотите. Этот способ позволит вам избавиться от сложной логики erb.

Чтобы проверить его действие, вы можете использовать json_spec.

Вот пример:

# example_controller.rb 

def workers 
    @GLANCE_IMAGE_API_WORKERS_NUM = 8 
    @GLANCE_BACKEND = "ceph" 
    @IMAGE_CACHE_MAX_SIZE = 10000000000 
    @GLUSTER_BACKEND = "ceph" 
end 

# app/views/whatever.jbuilder 

json.api do |json| 
    json.workers @GLANCE_IMAGE_API_WORKERS_NUM if @GLANCE_IMAGE_API_WORKERS_NUM 
    json.cache do |nest| 
    nest.image_cache_max_size @IMAGE_CACHE_MAX_SIZE 
    end 
end 

Он будет производить

{ 
    "api": { 
     "workers": 8, 
     "cache": { 
      "image_cache_max_size": 10000000000 
     } 
    } 
} 

Пожалуйста заметьте, я понятия не имею, как это ваш контроллер работает. Если вы предоставите более подробную информацию, я сделаю все возможное, чтобы помочь вам лучше.

+0

Спасибо за ваше предложение. Полезно знать. К сожалению, я застрял с логикой erb и вам нужно написать блок-тесты соответственно. Шеф-повар создает файл JSON с использованием файла ERB. Псевдо-код выше - это то, как я понимаю, что контроллер работает. – mickm