2016-06-17 9 views
0

windy json.erbロジックをテストする際に問題があります。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を構築するにはERB以下のテンプレートは、必要なJSONファイルを作成します。例えばglance_backendが「CEPH」に設定されている場合、コンマは次のエントリを可能にし、JSONを有効にするためにglance.image.api_workers後に必要になる - 例:

図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 == ""、末尾のコンマはありません。

  • image_cache_max_size != empty && glance_backend == 'not_ceph' && glance_image_api_workers == "not_empty"、末尾のコンマはありません。

  • image_cache_max_size != empty && glance_backend == 'ceph' && glance_image_api_workers == ""、末尾のコンマはありません。これは、このついて行くには完全に間違った方法かもしれ

    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 
    

    :Fig3 -

これまでのところ、私のRSpecのロジックは次のようになります。いくつかの提案を聞いて楽しみにしています。ありがとう。

答えて

1

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ロジックに固執しており、それに応じて単体テストを書く必要があります。 ChefはERBファイルを使用してJSONファイルを作成します。上記の擬似コードは、コントローラがどのように動作するかを理解する方法です。 – mickm

関連する問題