如何防止Pester Mocked Read-Host在代码覆盖期间提示输入

时间:2018-05-11 17:36:23

标签: unit-testing powershell mocking code-coverage pester

我有一个Pester测试,我为我的函数模拟了一个Read-Host调用,它遵循这个问题中的格式:

How do I mock Read-Host in a Pester test?

Describe "Test-Foo" {
    Context "When something" {
    Mock Read-Host {return "c:\example"}

        $result = Test-Foo

        It "Returns correct result" { # should work
            $result | Should Be "c:\example"
        }
         It "Returns correct result" { # should not work
            $result | Should Be "SomeThingWrong"
        }
    }
}

使用此格式时,我的测试运行完美,并直接调用测试。但是,当我使用Invoke-Pester" MyTestFile"运行包含我的测试的文件时-CodeCoverage" MyFileUnderTest",我被提示为我的测试输入一个Read-Host值。

我的意图是测试将自动运行而无需输入Read-Host值。这既可以直接调用测试(当前有效),也可以使用CodeCoverage命令调用我的测试文件。

有谁知道实现这个目标的方法?

编辑:

对于我收到的第一条评论,我查看了Pester的文档,包括此链接https://github.com/pester/Pester/wiki/Unit-Testing-within-Modules。我还没有看到Pester关于使用Read-Host的任何官方文档,并且使用了我在问题顶部的StackOverflow链接中找到的解决方案。

Module Test-Foo函数的源代码:

function Test-Foo
{
    return (Read-Host "Enter value->");
}

1 个答案:

答案 0 :(得分:3)

鉴于您的用例:模块测试-Foo功能

function Test-Foo {
    return (Read-Host -Prompt 'Enter value->')
}

我建议你改为模仿Test-Foo函数:

Context 'MyModule' {
    Mock -ModuleName MyModule Test-Foo { return 'C:\example' }

    It 'gets user input' {
        Test-Foo | Should -Be 'C:\example'
    }
}