2017-01-06 1 views
0

Я знаю, как написать функцию, которая передает поток из конвейера. Я могу разумно сказать, прочитав источник для функции, если он будет работать правильно. Однако существует ли какой-либо метод для фактического тестирования для правильного поведения?Как бы проверить, правильно ли функция PowerShell передает поток из конвейера?

Я принимаю любое определение «тестирование» ... будь то какой-то ручной тест, который я могу запустить или что-то более автоматизированное.

Если вам нужен пример, допустим, у меня есть функция, которая разбивает текст на слова.

PS> Get-Content ./warandpeace.txt | Split-Text 

Как я могу проверить, что он передает входные данные из конвейера и начинает немедленно расщепляться?

+0

Я хотел бы написать некоторые вспомогательные функции: 'функцию Print-Pipeline {параметр ($ Name, $ Цвет) начинаются {$ FC = если ($ PSBoundParameters.ContainsKey ('Color')) {@ {ForegroundColor = $ Цвет}} else {@ {}}} process {Write-Host "$ {Name}: Before: $ _" @FC; $ _; Write-Host "$ {Name}: After: $ _" @FC}} '- и использовать его следующим образом:' Get-Content ./warandpeace.txt | Print-Pipeline Get-Content Зеленый | Сплит-текст | Print-Pipeline Split-Text Cyan'. – PetSerAl

+0

@PetSerAl вы пишете такие хорошие комментарии. Верьте в себя и отправляйте их в качестве ответов вместо этого! :) –

ответ

0

Ах, у меня есть очень простое решение. Концепция заключается в том, чтобы вставить свой собственный шаг в конвейер с очевидными побочными эффектами до функции, которую вы тестируете. Например ...

PS> 1..10 | %{ Write-Host $_; $_ } | function-under-test 

Если функция испытуемый является «плохим», вы будете видеть все выход из 1..10 дважды, как этого

1 
2 
3 
1 
2 
3 

Если функция -under-test обрабатывает элементы лениво из конвейера, вы увидите чередование вывода.

1 
1 
2 
2 
3 
3 
1

Добавить Write-Verbose операторы Split-Text, а затем вызвать его с помощью параметра -Verbose. Вы должны видеть вывод в режиме реального времени.

+0

Но «реальное время» сложно и требует, чтобы я создавал произвольно большой и дорогостоящий (во время выполнения) ввод. Я бы наблюдал только потоковое воспроизведение, если бы я построил правильный ввод, нет? –

2

Вы можете написать вспомогательную функцию, которая даст вам некоторое представление о качестве детали трубопровода передается к нему и обрабатывается следующей командой:

function Print-Pipeline { 
    param($Name, [ConsoleColor]$Color) 
    begin { 
     $ColorParameter = if($PSBoundParameters.ContainsKey('Color')) { 
      @{ ForegroundColor = $Color } 
     } else { 
      @{ } 
     } 
    } 
    process { 
     Write-Host "${Name}|Before|$_" @ColorParameter 
     ,$_ 
     Write-Host "${Name}|After|$_" @ColorParameter 
    } 
} 

Предположим, у вас есть несколько функций для теста:

$Text = 'Some', 'Random', 'Text' 
function CharSplit1 { $Input | % GetEnumerator } 
filter CharSplit2 { $Input | % GetEnumerator } 

И вы можете проверить их так:

PS> $Text | 
>>> Print-Pipeline Before` CharSplit1 | 
>>> CharSplit1 | 
>>> Print-Pipeline After` CharSplit1 
Before CharSplit1|Before|Some 
Before CharSplit1|After|Some 
Before CharSplit1|Before|Random 
Before CharSplit1|After|Random 
Before CharSplit1|Before|Text 
Before CharSplit1|After|Text 
After CharSplit1|Before|S 
S 
After CharSplit1|After|S 
After CharSplit1|Before|o 
o 
After CharSplit1|After|o 
After CharSplit1|Before|m 
m 
After CharSplit1|After|m 
After CharSplit1|Before|e 
e 
After CharSplit1|After|e 
After CharSplit1|Before|R 
R 
After CharSplit1|After|R 
After CharSplit1|Before|a 
a 
After CharSplit1|After|a 
After CharSplit1|Before|n 
n 
After CharSplit1|After|n 
After CharSplit1|Before|d 
d 
After CharSplit1|After|d 
After CharSplit1|Before|o 
o 
After CharSplit1|After|o 
After CharSplit1|Before|m 
m 
After CharSplit1|After|m 
After CharSplit1|Before|T 
T 
After CharSplit1|After|T 
After CharSplit1|Before|e 
e 
After CharSplit1|After|e 
After CharSplit1|Before|x 
x 
After CharSplit1|After|x 
After CharSplit1|Before|t 
t 
After CharSplit1|After|t 
PS> $Text | 
>>> Print-Pipeline Before` CharSplit2 | 
>>> CharSplit2 | 
>>> Print-Pipeline After` CharSplit2 
Before CharSplit2|Before|Some 
After CharSplit2|Before|S 
S 
After CharSplit2|After|S 
After CharSplit2|Before|o 
o 
After CharSplit2|After|o 
After CharSplit2|Before|m 
m 
After CharSplit2|After|m 
After CharSplit2|Before|e 
e 
After CharSplit2|After|e 
Before CharSplit2|After|Some 
Before CharSplit2|Before|Random 
After CharSplit2|Before|R 
R 
After CharSplit2|After|R 
After CharSplit2|Before|a 
a 
After CharSplit2|After|a 
After CharSplit2|Before|n 
n 
After CharSplit2|After|n 
After CharSplit2|Before|d 
d 
After CharSplit2|After|d 
After CharSplit2|Before|o 
o 
After CharSplit2|After|o 
After CharSplit2|Before|m 
m 
After CharSplit2|After|m 
Before CharSplit2|After|Random 
Before CharSplit2|Before|Text 
After CharSplit2|Before|T 
T 
After CharSplit2|After|T 
After CharSplit2|Before|e 
e 
After CharSplit2|After|e 
After CharSplit2|Before|x 
x 
After CharSplit2|After|x 
After CharSplit2|Before|t 
t 
After CharSplit2|After|t 
Before CharSplit2|After|Text 
Смежные вопросы