Во-первых, я использую 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 <<<< -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 использует для обнаружения ОС.