如何在PowerShell中创建无构造函数的Microsoft.Web.Administration.Site实例用于测试?
解决办法
不用依赖真实IIS服务,也不用移除参数类型约束,有三种靠谱的方式能创建Microsoft.Web.Administration.Site的模拟对象用于Pester测试:
方案一:直接用New-Object创建实例(适合PowerShell 5+)
虽然这个类型没有公开的构造函数,但PowerShell的New-Object有时候能绕开这个限制,直接实例化并绑定需要的属性:
# 生成模拟的Site对象,按需添加函数用到的属性 $mockSite = New-Object -TypeName Microsoft.Web.Administration.Site -Property @{ Name = "TestSite" Id = 1 }
如果遇到初始化异常(比如类型内部有必须的初始化逻辑没触发),就换下面的方案。
方案二:给自定义对象“贴”上目标类型标识
先做一个带关键属性的自定义对象,再通过Add-Member让PowerShell把它识别成Microsoft.Web.Administration.Site类型:
Describe "Set-IisWebsiteBinding 测试" { It "正确处理站点绑定" { # 先做个带必要属性的假对象 $fakeSite = [PSCustomObject]@{ Name = "TestSite" Bindings = [Microsoft.Web.Administration.BindingCollection]::new() # 函数要用到啥属性就加啥 } # 给假对象打上目标类型的标记 $fakeSite | Add-Member -TypeName Microsoft.Web.Administration.Site -Force # 现在传进函数就不会触发类型校验错误了 { Set-IisWebsiteBinding -Website $fakeSite -BindingInformation "*:80:" } | Should -Not -Throw } }
这种方式很灵活,只要假对象的属性和方法能匹配函数的使用场景就行。
方案三:用反射调用非公开构造函数
通过.NET反射找到这个类型的非公开构造函数,直接创建实例,完全不依赖IIS:
# 获取Site类型 $siteType = [Microsoft.Web.Administration.Site] # 找到接受ServerManager参数的非公开构造函数 $constructor = $siteType.GetConstructor( [System.Reflection.BindingFlags]'NonPublic,Instance', $null, @([Microsoft.Web.Administration.ServerManager]), $null ) # 传入null作为ServerManager参数,创建实例 $mockSite = $constructor.Invoke(@($null))
这种方式生成的是真实的Microsoft.Web.Administration.Site实例,不用怕类型校验不通过,而且完全不需要启动IIS服务。
内容的提问来源于stack exchange,提问作者Simon Elms
相关产品推荐
相关产品推荐

