上下文
我有一个木偶模板,可以在渲染时解决count
事实的processors
子组件。这个事实存在于我的所有客户身上。
事实的用例是在模板行中对其执行十进制数学运算,例如:MyConfigVar=<%= 0.9 * @processors['count'] %>
文件中的.erb
。
我想:
我尝试过的事情:
首先,我尝试使用sigils:<%= 0.9 * @processors[:count] %>
。如果我用rspec-puppet嘲笑facts = { :processors => { :count => 10 } }
之类的东西,我的测试全部通过了。清单应用程序不起作用;它有一个“无法乘以nil
”错误。 Sigils显然已经出局了。
然后,我尝试使用拉链键:<%= 0.9 * @processors['count'] %>
。我没有选择使用sigil(facts = { :processors => { :count => 10 } }
)的测试,但我的值已经正确找到并乘以facts = { :processors => { 'count' => 10 } }
。然后所有测试通过。但是,清单应用程序因Can't coerce String into Int
失败而失败。
然后,我尝试使用stringy值。模板仍然读取<%= 0.9 * @processors['count'].to_i %>
,我测试了字符串和整数值,例如
let(:facts) { :processors => { 'count' => '10' } }
# tests with string value
let(:facts) { :processors => { 'count' => 10 } }
# tests with integer value
所有测试都通过了,但是清单应用程序为事实的值提供了0.0
。
问题:
两个主要问题:
rspec-puppet
或类似的模拟值在生产代表类型中进行可靠的单元测试?答案 0 :(得分:1)
为了它的价值,我对你的问题做了一些调查,并在我的测试床上对处理器进行了调查。事实上,虽然运行facter processors
时的哈希值实际上是一个字符串,一旦它进入Puppet / templates并且它没有任何分隔符(IE&#34; modelsIntel(R)Core(TM)i7-2760QM CPU @ 2.40GHzcount1physicalcount1&#34;是原始值)。我通过使用&#39; @ processors.class&#39;来验证了这一点。在我的ruby模板中,以及其他一些测试确定。我的测试平台运行Puppet 3.8.3和Facter 2.4.6,以防万一。
所以我建议的解决方案是:
直接在模板中使用Facter(非常非傀儡,但它有效)
<%= Facter.value(:processors)['count'] %>
使用正则表达式字符串解析(我不推荐这个,因为它很脆弱,但是它可以做到这一点)
count=@processors.dup.gsub!(/physicalcount/,'physical').gsub!(/.*count([0-9])+.*/,'\1')
很有可能在不同版本的Puppet / Facter中这不是一个问题,但希望这足以让你朝着正确的方向前进。
答案 1 :(得分:1)
这里有一些事情在发挥作用。
正如Josh Souza所说,旧版本的Facter不支持哈希或数组。因此,根据你使用的Puppet和Facter的版本,我会检查stringify_facts config的值是什么。
如果将此设置为true(它将在较旧的Puppet上),则事实不会以哈希形式出现,它们会被转换为清单中的字符串,从而导致没有分离的混合字符串(例如。{ {1}})。请注意modelsIntel(R) Core(TM) i7-2760QM CPU @ 2.40GHzcount1physicalcount1
,原始哈希中的count1
。
您可以使用rspec-puppet中的spec_helper中的:count => 1
设置&gt; = 2.2进行测试。
因此,如果您运行stringify_facts
,您可以看到许多遗留事实并非哈希:
facter -p
所以我建议使用$ facter -p | grep processor
processorcount => 8
processors => {"count"=>8, "speed"=>"2.5 GHz"}
sp_current_processor_speed => 2.5 GHz
sp_number_processors => 4
这个事实,因为这是一个整数,因为这是返回的值,但您可以使用$::processorcount
来确保to_i
1}}模板。我很确定它应该总是返回一个整数。
如果您感觉非常勇敢,可以创建一个函数将值转换为数字并在清单中使用它(例如https://github.com/kwilczynski/puppet-functions/blob/master/lib/puppet/parser/functions/str2num.rb)
所以你的代码看起来像是:
.erb
总而言之,它有点凌乱,你可以在Puppet 4中看到原因we have a much tighter typing system!