对Powershell Azure Function应用程序进行单元测试?

igetnqfo  于 2023-06-29  发布在  Shell
关注(0)|答案(2)|浏览(165)

我有一个用PowerShell编写的Azure函数:

function Invoke {
    param($Request)
    Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
        StatusCode = [HttpStatusCode]::OK
        Body       = "Hello!"
    })
}

我有一个针对这个函数的Pester单元测试:

Describe "Invoke" {
    It "Returns a 200 response" {
        $Response = Invoke -Request [HttpRequestContext]@{}
        $Response.StatusCode | Should Be ([HttpStatusCode]::OK)
    }
}

运行此测试将产生:

Describing Invoke
  [-] Returns a 200 response 4ms (3ms|1ms)
   RuntimeException: Unable to find type [HttpRequestContext].

大概PowerShellWorker在运行脚本时注入了这些类型,因此当Pester调用测试时它们不可用。按照意愿的下降顺序,我如何:
1.是否在测试运行中导入这些类型?例如,是否有模块可以导入?
1.注入这些类型的模拟?Pester支持创建对象的模拟,但不支持注入类型?
1.请求PowerShellWorker从我的测试中调用函数?(我可能会调用func host start并编写集成测试,但如果可能的话,我真的更喜欢单元测试。
我很感激任何能帮我的线索。
更新:正如评论中指出的,在压缩示例时,我删除了一个param()。为了澄清,这个想法是在测试和生产代码中支持类型注解。
更新2:根据McLayton的建议更正了拼写。

h22fl7wq

h22fl7wq1#

我还没有看到一个真正简洁的方法来单元测试PowerShell Azure Functions......或者至少他们肯定比一般的C#/JavaScript/Python少受欢迎。
但是,您可以使用New-MockObject模拟pester中的类型
我还看到了使用entryPoints运行脚本,然后独立于Azure Function测试脚本的方法,这样你就完全不必依赖worker运行时,但是你想深入到兔子洞里吗?!

xv8emn3q

xv8emn3q2#

我今天刚刚遇到了这个问题,我通过将run.ps1中的using语句移动到profile.ps1文件的顶部,并在dot-sourcing run.ps1之前向BeforeEach中的单元测试添加一个mock类型来解决它:

enum HttpStatusCode {
    OK
    InternalServerError
}
class HttpResponseContext {
    [HttpStatusCode]$StatusCode
    [string]$ContentType
    [string]$Body
}
function Push-OutputBinding($Name, $Value) {}

对我来说就像一个魅力。

相关问题