gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 03:11:33 26 4
gpt4 key购买 nike

上下文:

我有一个 puppet 模板可以解决 count processors 的子组件渲染时的事实。我的所有客户都存在这一事实。

事实的用例是在对其执行十进制数学运算的模板行中,例如:MyConfigVar=<%= 0.9 * @processors['count'] %>在一些.erb文件。

我想:

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

我尝试过的:

首先,我尝试使用印记:<%= 0.9 * @processors[:count] %> .如果我用 rspec-puppet mock ,类似于 facts = { :processors => { :count => 10 } } ,我的测试都通过了。 list 应用程序不起作用;它有一个“不能乘以nil”的错误。印记显然已经用完了。

然后,我尝试使用字符串键:<%= 0.9 * @processors['count'] %> .我对印记 ( facts = { :processors => { :count => 10 } } ) 的测试没有被接受,但我的值(value)被正确找到并乘以 facts = { :processors => { 'count' => 10 } } .然后所有测试都通过了。但是, list 应用程序失败并显示 Can't coerce String into Int失败。

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

let(:facts) { :processors => { 'count' => '10' } }
# tests with string value
let(:facts) { :processors => { 'count' => 10 } }
# tests with integer value

测试全部通过,但 list 应用程序已呈现 0.0为了事实的值(value)。

问题:

两个主要问题:

  1. 我怎样才能可靠地使用这个(或任何)事实进行内联十进制数学运算?
  2. 如何使用 rspec-puppet 可靠地进行单元测试?或类似的,实际上具有生产代表类型的模拟值?

最佳答案

这里有几件事在起作用。

正如 Josh Souza 所说,旧版本的 Facter 不支持散列或数组。因此,根据您使用的 Puppet 和 Facter 的版本,我会检查 stringify_facts 的值是多少配置。

如果将其设置为 true(它将在较旧的 Puppet 上设置),那么事实将不会以散列形式出现,它们会在您的 list 中转换为一个字符串,从而导致一个没有分隔的混合字符串(例如。modelsIntel(R) Core(TM) i7-2760QM CPU @ 2.40GHzcount1physicalcount1)。请注意 count1,在原始哈希中应该是 :count => 1

您可以在 rspec-puppet >= 2.2 的 spec_helper 中使用 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 来确定你的 .erb 模板。我很确定它应该始终返回一个整数。

如果你真的很勇敢,你可以创建一个函数来将值转换为数字并在你的 list 中使用它(例如 https://github.com/kwilczynski/puppet-functions/blob/master/lib/puppet/parser/functions/str2num.rb )

所以你的代码看起来像这样:

if (is_integer($::processorcount)) {
$processor_as_int = $::processorcount
} else {
$processor_as_int = str2num($::processorcount)
}

总而言之,有点乱,你可以在Puppet 4中看到为什么we have a much tighter typing system!

关于rspec - 我如何模拟事实来测试对事实进行十进制乘法的 Puppet 模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36851715/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com