我在测试一些有风的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
这可能是完全错误的方法。期待听到一些建议。感谢。
答案 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
}
}
}
请注意我不知道你的控制器是如何工作的。如果您提供更多详细信息,我们会尽力帮助您。