在 Mock 脚本块内部访问外部变量(Pester)

8
假设我有一个像这样的函数...
function Get-Something {
  return Get-DogShit
}

...在我的Pester测试脚本中...

$var = 1

Mock 'Get-Dogshit' { return $var }

it 'should return true' {
  Get-Something | should $var
}

这个方法不能工作,但你知道我在尝试什么吗?我想从本地变量中获取值到MOCK脚本块中。我想避免在mock中硬编码返回值和在it-block中期望的结果。你有什么办法能实现这个功能吗?


1
尝试使用return $using:var吗? - 4c74356b41
1
使用Pester时有任何作用域问题吗?$script:var = 1$global:var = 1 - G42
很遗憾,不行,但那是一个非常好的想法。当我尝试时,我得到了以下内容:“无法检索Using变量。在脚本工作流中,Using变量只能与Invoke-Command、Start-Job或InlineScript一起使用。当它与Invoke-Command一起使用时,仅当脚本块在远程计算机上调用时,Using变量才有效。” - Adam
1
@gms0ulman,这些方法都有效!我发誓在发布这篇文章之前已经尝试过$global,但现在两种方法都行了。 - Adam
2个回答

6
我曾经遇到过这个问题,脚本作用域不能解决,而我也不想使用全局作用域。一些研究表明,你可以使用闭包来解决这个问题。
$var = 1

Mock 'Get-Dogshit' { return $var }.GetNewClosure()

it 'should return true' {
  Get-Something | Should be $var
}

1
GetNewClosure()比全局作用域更好,我不确定它是否在Pester文档中有记录 - https://github.com/pester/Pester/issues/204,如果您想从正在测试的模块访问变量和私有函数,则还可以使用InModuleScope - https://github.com/pester/Pester/wiki/InModuleScope。 - severian
为了完整起见:看了一下作用域修饰符,我觉得也许using修饰符可能会起作用,因为它用于允许本地变量与远程会话一起使用。然而,在这种情况下它不起作用。不过,<ScriptBlock>.GetNewClosure()肯定可以。 - undefined

1

之前没有接触过 Pester,不确定它是否有效,但显然它遵循与标准 PowerShell 相同的作用域规则

所以,如果需要在脚本范围外调用它,可以使用 $script:var = 1,或者使用暴力方法 $global:var = 1


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接