我有一个用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的建议更正了拼写。
2条答案
按热度按时间h22fl7wq1#
我还没有看到一个真正简洁的方法来单元测试PowerShell Azure Functions......或者至少他们肯定比一般的C#/JavaScript/Python少受欢迎。
但是,您可以使用New-MockObject模拟pester中的类型
我还看到了使用entryPoints运行脚本,然后独立于Azure Function测试脚本的方法,这样你就完全不必依赖worker运行时,但是你想深入到兔子洞里吗?!
xv8emn3q2#
我今天刚刚遇到了这个问题,我通过将
run.ps1
中的using
语句移动到profile.ps1
文件的顶部,并在dot-sourcingrun.ps1
之前向BeforeEach
中的单元测试添加一个mock类型来解决它:对我来说就像一个魅力。