Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.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
Multithreading 如何在Pester Mock中使用PowerShell多线程和静态单元测试_Multithreading_Powershell_Mocking_Pester - Fatal编程技术网

Multithreading 如何在Pester Mock中使用PowerShell多线程和静态单元测试

Multithreading 如何在Pester Mock中使用PowerShell多线程和静态单元测试,multithreading,powershell,mocking,pester,Multithreading,Powershell,Mocking,Pester,我正在尝试在Powershell中执行一个简单的并行操作。我正在使用PoshRSJobs进行多线程处理,尽管我也尝试过用同样的问题调用并行。 我需要在作业的scriptbody中调用几个我自己的函数,但这不允许我为单元测试模拟这些函数(它们最终是原始的非模拟函数)。在这一点上,我只是想断言它们被调用的次数是正确的 这是原始类(导入模块的功能不相关-实际实现当前正在返回测试字符串) 这是纠缠测试 $here = Split-Path -Parent $MyInvocation.MyCommand.

我正在尝试在Powershell中执行一个简单的并行操作。我正在使用PoshRSJobs进行多线程处理,尽管我也尝试过用同样的问题调用并行。 我需要在作业的scriptbody中调用几个我自己的函数,但这不允许我为单元测试模拟这些函数(它们最终是原始的非模拟函数)。在这一点上,我只是想断言它们被调用的次数是正确的

这是原始类(导入模块的功能不相关-实际实现当前正在返回测试字符串)

这是纠缠测试

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

Describe "MyStuff" {
    BeforeEach {
        Mock Get-Assets { return "page1", "page2"}
        Mock Get-History { return "history" }
        Mock Convert-DataTable { 
            $historyDT = New-Object System.Data.Datatable;
            $historyDT.TableName = 'Test'
            return ,$historyDT
        }
        Mock Write-DataTable {}
    }
    It "should do something" {
        { MyStuff } | Should -Not -Throw;
    }
    It "should call Get-FLAssetGrid" {
        Assert-MockCalled Get-Assets 1
    }
    It "should call Get-FLHistory" {
        Assert-MockCalled Get-History 2
    }
    It "should call Convert-DataTable" {
        Assert-MockCalled Convert-DataTable 2
    }
    It "should call Write-DataTable" {
        Assert-MockCalled Write-DataTable 1
    }
}
这是Pester测试当前的输出

Describing MyStuff
  [+] should do something 1.71s
  [+] should call Get-Assets 211ms
  [-] should call Get-History 61ms
    Expected Get-History to be called at least 2 times but was called 0 times
    23:         Assert-MockCalled Get-History 2
    at <ScriptBlock>, myFile.Tests.ps1: line 23
  [-] should call Convert-DataTable 110ms
    Expected Convert-DataTable to be called at least 2 times but was called 0 times
    26:         Assert-MockCalled Convert-DataTable 2
    at <ScriptBlock>, myFile.Tests.ps1: line 26
  [+] should call Write-DataTable 91ms
描述MyStuff
[+]应该做一些1.71s的事情
[+]应调用Get Assets 211ms
[-]应呼叫获取历史记录61ms
应至少调用2次Get History,但调用了0次
23:Get History 2
在,myFile.Tests.ps1:第23行
[-]应调用Convert DataTable 110ms
应至少调用2次Convert DataTable,但调用了0次
26:Convert数据表2
在,myFile.Tests.ps1:第26行
[+]应调用写入数据表91ms

P> >最后,<强>我正在寻找一种在PowerShell进行并行操作的方法,并且仍然能够模拟和单元测试它们。< /强>

< p>我不认为这是一个完整的答案,而且我不在PistProject上工作,但我认为这不是纠缠的支持场景。这可能会在/if(也可能不会)时更改

如果您愿意更改您的实现,您可能能够绕过这个限制来支持某种测试

例如,当您的函数只有一件事要做时,它可能不使用RSJob(测试时可能会出现这种情况)

或者,您可以实现一个
-Serial
-NoParallel
-SingleRunspace
开关(或者在测试中设置为
1
-ConcurrencyFactor
),在这些条件下不使用运行空间


根据您的示例,很难判断这种测试是否充分测试了您想要的内容,但似乎确实如此。

我喜欢-不平行的想法!如果我想不出别的办法,那也许是最好的办法。目前正在根据一位同事的建议调查PowerShell工作流。@jrizzo工作流有各种限制,使用Pester之类的工具进行测试将更加困难。此外,PowerShell Core不支持工作流(预计Windows PowerShell将来不会有更新),因此我建议不要在新项目中使用工作流。
Describing MyStuff
  [+] should do something 1.71s
  [+] should call Get-Assets 211ms
  [-] should call Get-History 61ms
    Expected Get-History to be called at least 2 times but was called 0 times
    23:         Assert-MockCalled Get-History 2
    at <ScriptBlock>, myFile.Tests.ps1: line 23
  [-] should call Convert-DataTable 110ms
    Expected Convert-DataTable to be called at least 2 times but was called 0 times
    26:         Assert-MockCalled Convert-DataTable 2
    at <ScriptBlock>, myFile.Tests.ps1: line 26
  [+] should call Write-DataTable 91ms