Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 如何在匿名高级函数中使用Pester模拟函数_Unit Testing_Powershell_Pester - Fatal编程技术网

Unit testing 如何在匿名高级函数中使用Pester模拟函数

Unit testing 如何在匿名高级函数中使用Pester模拟函数,unit-testing,powershell,pester,Unit Testing,Powershell,Pester,我最近发现,我不需要使用导入模块来使用我的高级powershell函数,我可以在ps1文件中匿名定义一个函数 不幸的是,我的Pester单元测试被破坏了。我似乎再也无法模拟对下面清单中新对象的调用了。通常,我会在下面的代码中添加点源代码,并在我的范围内定义函数Get StockQuote。现在点源ps1文件没有帮助,因为我还是通过文件名调用函数 如何使用Pester用新对象的模拟实现测试以下代码 注意:就问题而言,这段代码显然是微不足道的,我正在使用的代码测试确实需要新对象的模拟实现 # Sou

我最近发现,我不需要使用导入模块来使用我的高级powershell函数,我可以在ps1文件中匿名定义一个函数

不幸的是,我的Pester单元测试被破坏了。我似乎再也无法模拟对下面清单中新对象的调用了。通常,我会在下面的代码中添加点源代码,并在我的范围内定义函数Get StockQuote。现在点源ps1文件没有帮助,因为我还是通过文件名调用函数

如何使用Pester用新对象的模拟实现测试以下代码

注意:就问题而言,这段代码显然是微不足道的,我正在使用的代码测试确实需要新对象的模拟实现

# Source listing of the file: Get-StockQuote.ps1
<#
.Synopsis
Looks up a stock quote
.Description
Uses the yahoo api to retrieve a recent quote for a given stock.
.Parameter Symbol
The stock trading symbol
.Example
Get-StockQuote.ps1 -Symbol AMZN
Prints the following line to the output
440.84
#>
[CmdletBinding()]
Param(
    [parameter(Mandatory=$false)]
    [string]$Symbol
)
BEGIN {
    Set-StrictMode -Version 1
}
PROCESS {
    (New-Object System.Net.WebClient).DownloadString("http://finance.yahoo.com/d/quotes.csv?s=$Symbol&f=l1")
}
END {
}
#文件的源列表:Get-StockQuote.ps1
[CmdletBinding()]
Param(
[参数(必需=$false)]
[字符串]$Symbol
)
开始{
设置StrictMode-版本1
}
过程{
(新对象系统.Net.WebClient)。下载字符串(“http://finance.yahoo.com/d/quotes.csv?s=$Symbol&f=l1“)
}
结束{
}

因此,我找到了一种方法,通过在BEGIN块中使用与文件名相同的名称定义一个命名函数,并从PROCESS块调用它

[CmdletBinding()]
Param(
    [parameter(Mandatory=$false)]
    [string]$Symbol
)

 BEGIN {
    Set-StrictMode -Version 1
    Function Get-StockQuote {
        [CmdletBinding()]
        Param(
            [parameter(Mandatory=$false)]
            [string]$Symbol
        )
        BEGIN{}
        PROCESS{
            (New-Object System.Net.WebClient).DownloadString("http://finance.yahoo.com/d/quotes.csv?s=$Symbol&f=l1")
        }
        END{}
    }
 }
 PROCESS {
    Get-StockQuote @PSBoundParameters
 }
 END {
 }
这样,在点源化我的ps1文件后,我将在范围中定义函数,Pester将开始正常工作

$here = Split-Path -Parent $MyInvocation.MyCommand.Path
$sut = (Split-Path -Leaf $MyInvocation.MyCommand.Path).Replace(".Tests.", ".")

. "$here\$sut"

Describe "Get a stock quote" {
    Mock New-Object {
        $retval = [pscustomobject]@{}
        Add-Member -InputObject $retval -MemberType ScriptMethod DownloadString {
            param( [string] $url )
            if ($url -imatch 'AMZN') {
                return 500.01
            }
            return 100.00
        }
        return $retval
    } -ParameterFilter {$TypeName -and ($TypeName -ilike 'System.Net.WebClient') }
    Context "when called for AMZN" {
        $result = Get-StockQuote -Symbol AMZN
        It "Should RETURN 500.01" {
            $result | should be 500.01
        }
    }
    Context "when called for anything else" {
        $result = Get-StockQuote -Symbol MSFT
        It "Should RETURN 100.00" {
            $result | should be 100.00
        }
    }
}
PowerShell脚本(.ps1文件)在它们自己的称为脚本作用域的作用域中运行。因此,我认为Pester很难模仿它使用的cmdlet

在解决方案中,您必须声明一个函数,该函数可以看到cmdlet的模拟版本