1

我写了一个非常简单的事实。它看起来像这样:

# Kubadmin facts
#
require 'json'

Facter.add(:has_kubectl) do
  confine :kernel => :linux
  setcode do
    Facter::Core::Execution.which('kubectl')
  end
end


Facter.add(:kubernetes_version) do
  confine :kernel => :linux
  kubernetes_json = Facter::Core::Execution.execute('/usr/bin/kubectl version -o json')
  kubernetes_parsed_json = JSON.parse(kubernetes_json)

  versions = {
    "client" => kubernetes_parsed_json['clientVersion']['gitVersion'],
    "server" => kubernetes_parsed_json['serverVersion']['gitVersion'],
  }

  setcode do
    versions
  end

end

我现在想测试这个事实,所以我为它写了一个规范测试

require 'spec_helper'

describe 'kubectl', :type => :fact do

  before :each do
    Facter.clear
    Facter.clear_messages
  end

  before(:each) do
    Facter.fact(:kernel).stubs(:value).returns('linux')
  end


  expected = File.read('spec/expected/kubectl_client_server.json')

  context 'kubectl installed' do
      it 'should return nil' do
        expect(Facter.fact(:has_kubectl).value).to eq nil
      end
  end


  context 'server and client returns' do
    it do
      Facter::Core::Execution.stubs(:execute).with('/usr/bin/kubectl version -o json').returns expected
        expect(Facter.fact(:kubernetes_version).value).to be_a(Hash)
        expect(Facter.fact(:kubernetes_version)).to include(
          'client' => "v1.8.4",
          'server' => "v1.8.4"
        )
    end
  end
end

当我运行测试时,我得到一个非常奇怪的错误:

1) kubectl kubectl installed should return nil
     Failure/Error: expect(Facter.fact(:has_kubectl).value).to eq nil

     Mocha::ExpectationError:
       unexpected invocation: Facter::Core::Execution.which("vmware")
       satisfied expectations:
       - allowed any number of times, not yet invoked: #<Puppet::Util::Feature:0x7f88fbc7cca8>.root?(any_parameters)
       - allowed any number of times, invoked 15 times: #<Facter::Util::Fact:0x7f88fbc96220>.value(any_parameters)
       - allowed any number of times, not yet invoked: Facter::Core::Execution.which("kubectl")

2) kubectl server and client returns
     Failure/Error:
       expect(Facter.fact(:kubernetes_version)).to include(
         'client' => "v1.8.4",
         'server' => "v1.8.4"
       )

     Mocha::ExpectationError:
       unexpected invocation: Facter::Core::Execution.execute("uname -r", {:on_fail => nil})
       satisfied expectations:
       - allowed any number of times, not yet invoked: #<Puppet::Util::Feature:0x7f88fbc7cca8>.root?(any_parameters)
       - allowed any number of times, invoked 13 times: #<Facter::Util::Fact:0x7f88fbf61748>.value(any_parameters)
       - allowed any number of times, invoked once: Facter::Core::Execution.execute("/usr/bin/kubectl version -o json")

我在这里做错了什么?

顺便说一句,此代码在这里:https ://github.com/jaxxstorm/puppet-kubeadm/blob/version_facts/spec/unit/facter/kubectl_spec.rb

4

0 回答 0