2

環境:

レンダリング時にファクトのcountサブコンポーネントに対処するパペット テンプレートがあります。processorsその事実は私のすべてのクライアントに存在します。

ファクトの使用例は、10 進数の計算を実行するテンプレート行にあります。たとえばMyConfigVar=<%= 0.9 * @processors['count'] %>、一部の.erbファイルです。

したい:

  1. テンプレート化されたコードを本番ホストにデプロイします。
  2. テンプレート用の堅牢な単体テストを作成して、事実のさまざまな妥当な値が与えられた場合に適切にレンダリングされることを確認できるようにします。

私が試したこと:

最初に、私は sigils: で試しました<%= 0.9 * @processors[:count] %>。rspec-puppet で のようなものをモックした場合facts = { :processors => { :count => 10 } }、テストはすべてパスしました。マニフェスト アプリケーションが機能しませんでした。「乗算できませんnil」というエラーがありました。シジルは明らかにアウトです。

次に、文字列のキーを試しました: <%= 0.9 * @processors['count'] %>. シジル ( ) を使用したテストはfacts = { :processors => { :count => 10 } }検出されませんでしたが、値が適切に検出され、 が乗算されましたfacts = { :processors => { 'count' => 10 } }。その後、すべてのテストに合格しました。ただし、マニフェストの適用は失敗で失敗しました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

0.0テストはすべて合格しましたが、マニフェスト アプリケーションは事実の価値のためにレンダリングされました。

質問:

2 つの主な質問:

  1. この (または任意の) 事実を確実に処理するインライン 10 進数を取得するにはどうすればよいですか?
  2. rspec-puppet実稼働を代表する型を使用して、値を実際に使用して、または同様にモックすることで、確実に単体テストを行うにはどうすればよいですか?
4

2 に答える 2

1

それが価値があるために、私はあなたの問題についていくつかの調査を行いました.私のテストベッドでは、「プロセッサ」の事実は、実行中のハッシュfacter processorsですが、実際にはパペット/テンプレートに入ると文字列であり、区切り文字がありません(IE 「modelsIntel(R) Core(TM) i7-2760QM CPU @ 2.40GHzcount1physicalcount1」は生の値です)。Rubyテンプレートで「@processors.class」を使用してこれを確認し、他のいくつかのテストを確認しました. 私のテストベッドは、影響を受けた場合に備えて、Puppet 3.8.3 と Facter 2.4.6 を実行しています。

したがって、私が提案できる解決策は次のとおりです。

  1. @processorcount ファクトを使用します。これは常に整数であり、単体テストのシジルで問題なく動作するはずです。
  2. テンプレート内で Facter を直接使用します (これは非常に人形的ではありませんが、機能します)。

    • <%= Facter.value(:processors)['count'] %>
  3. 正規表現文字列解析を使用します (これは壊れやすくハッキーなのでお勧めしませんが、うまくいきます)

    • count=@processors.dup.gsub!(/physicalcount/,'physical').gsub!(/.*count([0-9])+.*/,'\1')

異なるバージョンの Puppet/Facter ではこれが問題にならない可能性は十分にありますが、正しい方向に進むにはこれで十分であることを願っています。

于 2016-04-27T17:20:52.397 に答える