Как я могу издеваться над содержимым .cs файла с помощью Pester, позволяя мне перебирать каждую строку и каждый символ? - PullRequest
1 голос
/ 06 мая 2019

Краткое описание:

Я пытаюсь использовать Пестера, чтобы высмеивать содержимое файла, а затем перебирать каждую строку и каждый символ этих фальшивых данных, но я получаюэта ошибка: «индекс массива оценивается как ноль».при попытке доступа к символам строки.

Справочная информация:

У меня есть функция Powershell, которая читает содержимое файла global.asax.cs.

Пример файла, из которого я читаю:

namespace MockData
{
    public class WebApiApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        { 
            MvcHandler.DisableMvcResponseHeader = true;
        }
    }
}

Затем моя функция будет использовать Get-Content для чтения файла и перебора каждой строки и каждого символа.Пример (упрощенная версия, переменная $ index в этом примере выглядит неприятно, но она необходима в реальном коде):

        $contents = Get-Content $filePath
        $index = 0
        $bracketCounter = 0

        Do {
            foreach($char in  $contents[$index].ToCharArray()) {
                if($char -eq "{") {
                    $bracketCounter++
                }
                elseif ($char -eq "}") {
                    $bracketCounter--
                }
            }
            $index++
        } While ($bracketCounter -gt 0)

Теперь в Pester это код для моего теста:

It "check for success" {
    Mock Get-Content {
        $content = "namespace MockData
        {
            public class WebApiApplication : System.Web.HttpApplication
            {
                protected void Application_Start()
                { 
                    MvcHandler.DisableMvcResponseHeader = true;
                }
            }
        }"
        return $content
    } -ParameterFilter { $Path -like "*asax*"}

    [string[]]$errors = MyPowershellFile
    $errors | should BeNullOrEmpty
}

Ожидаемые результаты:

Мои ожидаемые результаты состоят в том, что тест Пестера итерирует содержимое макета так же, как и с реальным содержимым.

Ошибка отПестер при вызове этой строки происходит:

foreach($char in  $contents[$index].ToCharArray()) 

Я получаю «RuntimeException: операция индекса не выполнена; индекс массива оценивается как ноль».

Я думаю, это происходит потому, что в реальной функцииПервый элемент $ contents - это первая строка файла.

$contents[0] = namespace MockData

В функции Pester первым элементом $ contents является первый символ.

$contents[0] = n

Есть ли хороший способ обойти это?У меня заканчиваются идеи.

Заранее спасибо всем, кто читает этот вопрос.

Ответы [ 2 ]

3 голосов
/ 07 мая 2019

Почему бы не записать в TestDrive , а затем высказать:

Describe 'test things' {
#create a here-string and write the contents to the testdrive
@"
    namespace MockData
    {
        public class WebApiApplication : System.Web.HttpApplication
        {
            protected void Application_Start()
            { 
                MvcHandler.DisableMvcResponseHeader = true;
            }
        }
    }
"@ | Set-Content -Path TestDrive:\testfile.txt

    #Set up the mock to get-content
    Mock Get-Content {
        Get-Content TestDrive:\testfile.txt
    } -ParameterFilter {$path -like "*asax*"}

    #make sure the content matches
    it "finds strings in mocked content" {
        Get-Content abc.asax | Select-String MVCHandler | Should -Match 'MvcHandler.DisableMvcResponseHeader = true;'
    }

    #make sure the line count is correct
    it 'should have 10 lines of content' {
        (Get-Content def.asax).Count | Should -BeExactly 10
    }

    #make sure our mock was called the correct number of times
    it "called mocked get-content twice" {
        Assert-MockCalled Get-Content -Times 2
    }
}

Это создаст фактический файл, имитирующий производство, чтобы вы могли правильно его протестировать.

1 голос
/ 06 мая 2019

Get-Content возвращает массив строк, а ваш макет возвращает одну строку.

Попробуйте следующий код:

It "check for success" {
Mock Get-Content {
    $content = @("namespace MockData"
    "{"
    "    public class WebApiApplication : System.Web.HttpApplication"
    "    {"
    "        protected void Application_Start()"
    "        { "
    "            MvcHandler.DisableMvcResponseHeader = true;"
    "        }"
    "    }"
    "}")
    return $content
} -ParameterFilter { $Path -like "*asax*"}

[string[]]$errors = MyPowershellFile
$errors | should BeNullOrEmpty
}
...