纠缠:在内容丰富的-ForEach数据驱动测试中使用变量



我写了一个模块,用于powershell包装命令行工具。

对于我的测试,我在BeforeAll中定义了一些变量。这些变量应该有助于为命令提供所需的参数,并根据预期结果检查它们,例如

BeforeAll {
$PORead=@{
Name = "Paul"
Permission ="Read"
Inheritance = "ThisFolderSubfoldersAndFiles"
}
$POReadExp="-bla bla (bla:bla;fra:fra;tra:tra)"
}

现在我想在it段中使用这些来提供函数并检查结果,如:

It "checks result" -ForEach (
@{Param=$PORead;Expected=$POReadExp}
) {
$result=FunctionCall -Parameter1 $Param
$result | Should -Be $Expected
}

注意:这实际上不是工作代码——只是为了弄清楚我想要什么。

问题是,$Param和$Expected是$null,因此$PORead和$POReadExp的当前值没有分配给$Param和$Expected。我让演示这个问题变得容易了——在我的代码中,我使用了分配给$Param和$Expected的- foreach散列中的数组。

使用普通字符串,没有问题,一切都很好。我可以使用纯文本,然后使用som开关结构来匹配我的字符串与来自BeforeAll{}的相应变量,但我认为必须有一个更优雅的方式。

使用标准哈希表,变量替换工作良好。

我很感激。


澄清一些事情:

Mark的解决方案在某种程度上是有效的,但是它需要在beforeall块之外设置$PORead和$ poereadexp(如果你想使用-ForEach),或者在beforeall块中设置,但是在这种情况下,你只能使用一个参数。

我的计划有点不同,所以我把我的观点更清楚一些:

在beforeall块中,我想要一堆参数和结果的定义

BeforeAll {
$PORead = @{
Name = "Paul"
Permission ="Read"
Inheritance = "ThisFolderSubfoldersAndFiles"
$PODelete = @{
Name = "Paul"
Permission ="Delete"
Inheritance = "ThisFolderOnly"
}
$POReadResult = "add parameters"
$PODeleteResult = "delete parameters"
}

现在我想测试一大堆组合,将不同的组合提供给函数并检查结果的组合是否匹配:

It "Test if all combinations works" -ForEach(
@{FunctionParam=$PORead;Expected=$POReadExp}
@{FunctionParam=$PORead,$PORead;Expected=$POReadExp,$POReadExp}
@{FunctionParam=$PORead,$PODelete,$PORead,$PORead;Expected=$PORead,$PORead,$PORead,$PODelete}
) {
$result = Function-Call -Param $FunctionParam
$wanted = $expected -join(" ")
$result | Should -Be $wanted
}

可以通过将定义放在任何块之外来实现这一点,但就困扰编码指南而言,这感觉是错误的。

问候Usul

如何使用Pester v5设置测试数据的范围非常令人困惑。我发现,在BeforeAllBeforeEach中设置的任何内容都可以在It中使用。但是,如果您想将值设置为-ForEach(或其别名-TestData),则需要将其设置为It的一部分或之前,在BeforeEachBeforeAll之外。

因此,我认为你的测试将工作,如果你这样做:

$PORead = @{
Name = "Paul"
Permission ="Read"
Inheritance = "ThisFolderSubfoldersAndFiles"
}
$POReadExp = "-bla bla (bla:bla;fra:fra;tra:tra)"
It "checks result" -ForEach (
@{Param=$PORead;Expected=$POReadExp}
) {
$result=FunctionCall -Parameter1 $Param
$result | Should -Be $Expected
}

或者(如果您只需要执行一个测试):

BeforeAll {
$PORead=@{
Name = "Paul"
Permission ="Read"
Inheritance = "ThisFolderSubfoldersAndFiles"
}
$POReadExp="-bla bla (bla:bla;fra:fra;tra:tra)"
}
It "checks result" {
$result = FunctionCall -Parameter1 $PORead
$result | Should -Be $POReadExp
}

如果您想避免使用不在某个Pester代码块内的变量,那么您应该这样做(这与Pester文档中关于数据驱动测试的示例一致):

It "checks result" -ForEach (
@{
Param = @{
Name = "Paul"
Permission = "Read"
Inheritance = "ThisFolderSubfoldersAndFiles"
}
Expected = "-bla bla (bla:bla;fra:fra;tra:tra)"
}) {
$result=FunctionCall -Parameter1 $Param
$result | Should -Be $Expected
}

您需要将用于生成测试的数据从BeforEach{}块移动到BeforeDiscovery{}块(参见链接的pester文档,有一个非常好的简单示例)。

在动态生成测试用例之前,Pester需要驱动DataDrivenTests的数据可用,这样它就知道要生成多少个测试用例。

BeforeAll{}/BeforeEach{}块应该保留用于在It{}块生成之后,但在它们被求值之前使用的数据。

最新更新