You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 06:37:07