首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pester:在内容丰富的-ForEach数据驱动测试中使用变量

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

Stack Overflow用户
提问于 2021-10-26 08:35:19
回答 1查看 801关注 0票数 1

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

对于我的测试,我在BeforeAll中定义了一些变量。这些vars应该帮助给命令提供所需的参数,并检查它们是否符合预期的结果,f.i。

代码语言:javascript
复制
BeforeAll {
   $PORead=@{
      Name = "Paul"
      Permission ="Read"
      Inheritance = "ThisFolderSubfoldersAndFiles"
   }

   $POReadExp="-bla bla (bla:bla;fra:fra;tra:tra)"
}

现在,我希望在it段中使用这些内容来填充函数并检查结果,例如:

代码语言:javascript
复制
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的$Param哈希和$Expected中使用数组。

使用简单的字符串,没有问题,一切都很好。我可以使用纯文本,而不是使用som开关构造来将我的字符串与BeforeAll{}中的相应变量匹配,但我认为肯定有一种更优雅的方法。

使用标准哈希表,变量substition可以正常工作。

任何想法我都会感激的。

为了澄清一些事情:

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

我的计划有点不同,所以我想说得更清楚一点:

在前面的块中,我想要一堆对参数和结果的定义。

代码语言:javascript
复制
BeforeAll {
   $PORead = @{
   Name = "Paul"
   Permission ="Read"
   Inheritance = "ThisFolderSubfoldersAndFiles"

   $PODelete = @{
   Name = "Paul"
   Permission ="Delete"
   Inheritance = "ThisFolderOnly"
   }

   $POReadResult = "add parameters"
   $PODeleteResult = "delete parameters"
}

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

代码语言:javascript
复制
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
}

我可以通过将定义从任何块中排除出来来实现这一点,但在纠缠编码准则方面,我觉得这是错误的。

打招呼

EN

回答 1

Stack Overflow用户

发布于 2021-10-26 09:34:50

如何使用Pester v5设置测试数据的作用域非常混乱。我发现在BeforeAllBeforeEach中设置的任何东西在It中都是可用的。但是,如果要将值设置为-ForEach (或别名-TestData),则需要将其设置为It的一部分或之前、BeforeEachBeforeAll之外的值。

因此,我认为如果您这样做,您的测试将有效:

代码语言:javascript
复制
$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
}

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

代码语言:javascript
复制
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代码块中的变量,那么您应该这样做(这与数据驱动测试的纠缠文档中给出的示例一致):

代码语言:javascript
复制
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
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69719914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档