我有一个用于在 IIS 中设置网站的 PowerShell 脚本。它包含以下功能:
function Set-IisWebsiteBinding (
[Parameter(Mandatory = $true)]
[string]$SiteName,
[Parameter(Mandatory = $true)]
[Microsoft.Web.Administration.Site]$Website,
[Parameter(Mandatory = $true)]
[array]$WebsiteBindingSettings
)
{
# Set up website bindings ...
}
我正在尝试在 Pester 中为该函数编写测试。我想创建一个虚拟的 $Website 对象传递给被测函数。问题是该类型没有构造函数。如果没有构造函数Microsoft.Web.Administration.Site
,如何在 PowerShell 中创建该类型的对象?Microsoft.Web.Administration.Site
我可以通过 创建一个,IISServerManager.Sites.CreateElement()
但我想避免依赖于使用真实的IISServerManager
。或者,我可以去掉函数参数 的类型强制转换$Website
,这样测试代码就可以传入一个哈希表而不是 Microsoft.Web.Administration.Site 对象。不过,我更倾向于保留类型强制转换,这样脚本的未来维护者就能清楚地知道对象的类型$Website
。
有没有办法解决缺少构造函数的问题,而不使用实数IISServerManager
或删除类型强制?
Pester 提供了一个简单的选项来为不提供公共构造函数的类型创建对象
New-MockObject
:或者,您可以使用 Pester 使用的相同 API 来创建它
FormatterServices.GetUninitializedObject(Type)
。在这两种情况下,正如评论中所述,仍然值得补充的是,您将需要加载 IISAdministration 模块或其程序集。
如果您好奇,该方法本质上使用了内部 API
RuntimeType
:。RuntimeHelpers.CoreCLR.cs#L330-L345
不确定它用于 .NET Framework 的什么,代码是闭源的。