ruby,rspec和json.erb:单元测试JSON模板

时间:2016-06-17 17:10:32

标签: ruby json rspec erb

我在测试一些有风的json.erb逻辑时遇到了一些麻烦。下面的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 !@IMAGE_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设置为&#39; ceph&#39;,则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 == "",则没有逗号;

  • 如果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 == "",则没有逗号。

到目前为止,我的rspec逻辑看起来像这样 - 图3:

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 个答案:

答案 0 :(得分: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
        }
    }
}

请注意我不知道你的控制器是如何工作的。如果您提供更多详细信息,我们会尽力帮助您。