纠缠者:如何让我的脚本不被 运行 发现?
Pester: How do I keep my script from running?
我正在测试 PowerShell 脚本。我想在不执行整个脚本的情况下测试单个函数。我不确定这是否是预期的用例或是否受支持,而且我在网上搜索时找不到好的答案
总结ps1:
Param(
[Parameter(Mandatory = $true,
Position = 0)]
[ValidateNotNullOrEmpty()]
[string] $Message
)
function fut([string] $argument) {
Write-Host $argument
}
function Main() {
fut($Message)
}
Main
sut.tests.ps1:
$here = Split-Path -Parent $MyInvocation.MyCommand.Path
$sut = (Split-Path -Leaf $MyInvocation.MyCommand.Path) -replace '\.Tests\.', '.'
. "$here$sut" "Message"
Describe "fut" {
It "does something useful" {
fut 'beer'
}
}
输出
Message
Describing fut
beer
[+] does something useful 385ms
Tests completed in 385ms
现在我可以模拟 'beer',因为它在 describe 块中运行。但我无法模拟 'message',因为脚本在我点源时开始执行。
在我的例子中,'message' 是我不想执行的操作。
我在 Windows 10 15063。
根据评论,问题是您的脚本是自执行的,因此如果不执行函数,则无法通过点源为 Pester 加载它。
Roman 建议临时使用 Set-Alias
将 main
设置为 Out-Null
的解决方法可行。另一个建议是将您的函数分离到一个单独的文件(例如命名为 functions.ps1
),然后在您的原始脚本中您可以使用点源来包含它,但在您的测试脚本中只是点源 functions.ps1
文件。
如果它不像 pester 脚本那样被称为 ny Dot Source,这只会 运行 主要功能。我正在使用它而不是将函数拆分到不需要它的另一个文件。然后在不调用 Main 函数的情况下纠缠 运行s。
if (-not ($MyInvocation.InvocationName -eq "."))
{
Main
}
我正在测试 PowerShell 脚本。我想在不执行整个脚本的情况下测试单个函数。我不确定这是否是预期的用例或是否受支持,而且我在网上搜索时找不到好的答案
总结ps1:
Param(
[Parameter(Mandatory = $true,
Position = 0)]
[ValidateNotNullOrEmpty()]
[string] $Message
)
function fut([string] $argument) {
Write-Host $argument
}
function Main() {
fut($Message)
}
Main
sut.tests.ps1:
$here = Split-Path -Parent $MyInvocation.MyCommand.Path
$sut = (Split-Path -Leaf $MyInvocation.MyCommand.Path) -replace '\.Tests\.', '.'
. "$here$sut" "Message"
Describe "fut" {
It "does something useful" {
fut 'beer'
}
}
输出
Message
Describing fut
beer
[+] does something useful 385ms
Tests completed in 385ms
现在我可以模拟 'beer',因为它在 describe 块中运行。但我无法模拟 'message',因为脚本在我点源时开始执行。
在我的例子中,'message' 是我不想执行的操作。
我在 Windows 10 15063。
根据评论,问题是您的脚本是自执行的,因此如果不执行函数,则无法通过点源为 Pester 加载它。
Roman 建议临时使用 Set-Alias
将 main
设置为 Out-Null
的解决方法可行。另一个建议是将您的函数分离到一个单独的文件(例如命名为 functions.ps1
),然后在您的原始脚本中您可以使用点源来包含它,但在您的测试脚本中只是点源 functions.ps1
文件。
如果它不像 pester 脚本那样被称为 ny Dot Source,这只会 运行 主要功能。我正在使用它而不是将函数拆分到不需要它的另一个文件。然后在不调用 Main 函数的情况下纠缠 运行s。
if (-not ($MyInvocation.InvocationName -eq "."))
{
Main
}