首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何模拟事实来测试对事实进行十进制乘法的伪模板?

我如何模拟事实来测试对事实进行十进制乘法的伪模板?
EN

Stack Overflow用户
提问于 2016-04-25 21:49:59
回答 2查看 1.1K关注 0票数 3

上下文:

我有一个木偶模板,它在呈现时处理processors事实的processors子组件。我所有的客户都有这个事实。

这个事实的用例在执行十进制运算的模板行中,例如:MyConfigVar=<%= 0.9 * @processors['count'] %>在某个.erb文件中。

我想:

  1. 将我的模板代码部署到生产主机上。
  2. 为我的模板编写健壮的单元测试,这样我就可以确保它能够正确地呈现,为事实提供各种合理的值。

我尝试过的:

首先,我尝试使用sigils:<%= 0.9 * @processors[:count] %>。如果我用rspec-傀儡来嘲弄,就像facts = { :processors => { :count => 10 } }一样,我的测试都通过了。清单应用程序没有工作;它有一个“不能乘以nil”错误。很明显西格尔斯出局了。

然后,我尝试使用字符串键:<%= 0.9 * @processors['count'] %>。我使用sigil (facts = { :processors => { :count => 10 } })的测试没有被捕获,但我的值被正确地找到并与facts = { :processors => { 'count' => 10 } }相乘。所有的测试都通过了。但是,清单应用程序由于Can't coerce String into Int失败而失败。

然后,我尝试使用严格的值。模板仍然读取<%= 0.9 * @processors['count'].to_i %>,我测试了字符串和整数值。

代码语言:javascript
复制
let(:facts) { :processors => { 'count' => '10' } }
# tests with string value
let(:facts) { :processors => { 'count' => 10 } }
# tests with integer value

测试全部通过,但清单应用程序为事实的值呈现了0.0

问题:

两个主要问题:

  1. 如何使内联十进制数学可靠地处理这个(或任何)事实?
  2. 我如何能够可靠地使用rspec-puppet或类似的单元测试,在生产代表类型的facter中模拟值?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-28 11:30:10

这里有几件事在起作用。

正如Josh Souza所说,旧版本的Facter不支持散列或数组。因此,根据您使用的木偶和Facter的版本,我将检查事实配置的值。

如果这被设置为真(这将是在老木偶上),那么事实就不会以散列的形式出现,它们会在你的清单中被转换成一个字符串,导致没有分离的杂乱字符串(例如。modelsIntel(R) Core(TM) i7-2760QM CPU @ 2.40GHzcount1physicalcount1)。注意count1,在原始散列中应该是:count => 1

您可以在RSpec-pupeRSpec2.2中的stringify_facts设置中测试这一点。

因此,如果您运行facter -p,您可以看到许多遗留事实不是散列。

代码语言:javascript
复制
$ 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来确保您的.erb模板。我很确定它应该总是返回一个整数。

如果您感到非常勇敢,可以创建一个函数将值转换为数字并在清单中使用(例如,https://github.com/kwilczynski/puppet-functions/blob/master/lib/puppet/parser/functions/str2num.rb)。

所以你的代码看起来是:

代码语言:javascript
复制
if (is_integer($::processorcount)) {
  $processor_as_int = $::processorcount
} else {
  $processor_as_int = str2num($::processorcount)
}

总之,这有点混乱,你可以看到为什么在木偶4 我们的打字系统要紧得多!

票数 2
EN

Stack Overflow用户

发布于 2016-04-27 17:20:52

为了说明它的价值,我对您的问题做了一些调查,在我的测试床上,运行facter processors时的“处理器”事实实际上是一个字符串,一旦它进入木偶/模板,它就没有任何分隔符(即"modelsIntel(R) Core(TM) i7-2760QMcpu@2.40GHzCount1PhyalCount 1“是原始值)。我通过在我的红宝石模板中使用'@processors.class‘来验证这一点,当然还有其他一些测试。我的测试床运行的是Puppet3.8.3和Facter 2.4.6,以防这影响到事情。

因此,我可以提出的解决办法是:

  1. 使用@processorcount事实,它将始终是一个整数,并且在单元测试中可以很好地处理sigils。
  2. 直接在模板中使用Facter (这是非常非傀儡的,但它有效)
代码语言:javascript
复制
- `<%= Facter.value(:processors)['count'] %>`

  1. 使用regex字符串解析(我不建议这样做,因为它很脆弱,很麻烦,但它确实有用)
代码语言:javascript
复制
- `count=@processors.dup.gsub!(/physicalcount/,'physical').gsub!(/.*count([0-9])+.*/,'\1')`

很有可能在不同版本的木偶/Facter中,这不是一个问题,但希望这足以让您朝着正确的方向前进。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36851715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档