Первый должен быть установлен в тесте, всегда терпит неудачу в Windows

Во-первых, я использую serverpec 2.3.1 и specinfra 2.4.2 с Ruby 1.9.3p550.

Я все еще изучаю проблему, но я решил попробовать спросить здесь, если кто-то столкнется с проблемой раньше (а если нет, и я выясню это, может быть, следующий человек, который столкнется с этим, найдет этот ответ в Google ).

Цель состоит в том, чтобы иметь спецификационный файл со всем программным обеспечением, которое должно быть установлено в тестовой системе. Что странно, так это то, что независимо от того, что я пишу, в первый раз, когда я делаю it { should be_installed }, это не удается. Никаких исключений.

Код ниже показывает, что я имею в виду:

require 'acceptance_helper'

describe package('7-Zip 9.22 (x64 edition)') do
  it { should be_installed }
end

describe package('7-Zip 9.22 (x64 edition)') do
  it { should be_installed }
end

describe package('Zend Server') do
  it { should be_installed }
end

describe package('SQL Server 2012 Management Studio') do
  it { should be_installed }
end

describe package('Microsoft SQL Server 2012 (64-bit)') do
  it { should be_installed }
end

Когда я запускаю этот файл, я получаю первый тест, который говорит, что 7-Zip не установлен, а второй тест говорит, что это так. Все, что я ставлю в качестве первого теста, делает то же самое.

Package "7-Zip 9.22 (x64 edition)"
  should be installed (FAILED - 1)

Package "7-Zip 9.22 (x64 edition)"
  should be installed

Package "Zend Server"
  should be installed

Package "SQL Server 2012 Management Studio"
  should be installed

Package "Microsoft SQL Server 2012 (64-bit)"
  should be installed

Failures:

  1) Package "7-Zip 9.22 (x64 edition)" should be installed
     Failure/Error: it { should be_installed }
     TypeError:
       can't convert Symbol into Integer
       uname -s
       #< CLIXML
<Objs Version="1.1.0.1" xmlns="http://schemas.microsoft.com/powershell/2004/04"><S S="Error">The term 'uname' is not recognized as the name of a cmdlet, function, script fi_x000D__x000A_</S><S S="Error">le, or operable program. Check the spelling of the name, or if a path was inclu_x000D__x000A_</S><S S="Error">ded, verify that the path is correct and try again._x000D__x000A_</S><S S="Error">At line:1 char:6_x000D__x000A_</S><S S="Error">+ uname &lt;&lt;&lt;&lt;  -s_x000D__x000A_</S><S S="Error">    + CategoryInfo          : ObjectNotFound: (uname:String) [], CommandNotFou _x000D__x000A_</S><S S="Error">   ndException_x000D__x000A_</S><S S="Error">    + FullyQualifiedErrorId : CommandNotFoundException_x000D__x000A_</S><S S="Error"> _x000D__x000A_</S></Objs>
 # ./spec/acceptance/192.168.0.70/all_required_applications_are_installed_spec.rb:4:in `block (2 levels) in <top (required)>'

Finished in 25.96 seconds (files took 0.99763 seconds to load)
5 examples, 1 failure

Failed examples:

rspec ./spec/acceptance/192.168.0.70/all_required_applications_are_installed_spec.rb:4 # Package "7-Zip 9.22 (x64 edition)" should be installed

Что для меня нереально, так это то, что только первый тест провалится, поэтому я действительно не уверен, что может произойти. Я буду исследовать и обновлять этот пост по ходу дела, но если кто-то когда-либо сталкивался с этим, мне бы очень хотелось услышать, как / если вы исправили это!

Редактировать. Судя по сообщению об ошибке и тому, как ServerSpecs проверяет пакеты в Windows, я подумал, что команда была выполнена неправильно, но оказалось, что ошибка возникает еще до того, как команда будет запущена. По крайней мере, так выглядит, поскольку в Intellij IDEA, когда я ставлю точку останова в строке 7 строки specinfra/command/windows/base/package.rb (exec "(FindInstalledApplication -appName '#{package}' #{version_selection}) -eq $true"), точка останова никогда не достигается, тест завершается неудачей и он переходит к следующему тесту.

Изменить 2: удалось немного изолировать проблему, кажется, это произошло в specinfra\helper\os.rb. Я новичок в Ruby, поэтому его немного сложно отлаживать, но я предполагаю, что что-то неправильно инициализируется при первом запуске того, что ServerSpec/SpecInfra использует для обнаружения ОС.


person gCardinal    schedule 11.11.2014    source источник


Ответы (1)


Что ж, оказывается, я глупый и не умею нормально читать документацию. В документации Serverspec говорится, что ОС Windows должна быть указана в spec_helper, и я только скопировал/вставил вспомогательный пример из их документ для Windows.

Теперь это мой вспомогательный файл, обратите внимание на строку set :os

require 'serverspec'
require 'winrm'
require 'yaml'

set :backend, :winrm
set :os, :family => 'windows', :release => '2008', :arch => 'x64'

base_path = File.dirname(File.expand_path(__FILE__))
config = YAML.load_file(File.join(base_path, 'config.yml'))

user = 'vagrant'
pass = 'vagrant'
endpoint = "http://#{config['host_ip']}:5985/wsman"

winrm = ::WinRM::WinRMWebService.new(endpoint, :ssl, :user => user, :pass => pass, :basic_auth_only => true)
winrm.set_timeout 300 # 5 minutes max timeout for any operation
Specinfra.configuration.winrm = winrm
person gCardinal    schedule 12.11.2014
comment
Я наблюдал аналогичную проблему с тестами, связанными с файлами, когда он периодически терпел неудачу с сообщением о том, что uname не может быть найден. Установка ОС и семейства явно в spec_helper.rb, похоже, устранила проблему. Спасибо, что опубликовали это. Я посмотрю, смогу ли я открыть для них PR, чтобы обновить документацию. - person sworisbreathing; 10.12.2014
comment
Я рад, что это помогло!! Спасибо за пиар (надо было это сделать, не знаю, почему я об этом не подумал), уверен, многим это поможет! - person gCardinal; 10.12.2014