gpt4 book ai didi

c# - 如何在 C# 中对 PowerShell Core 二进制 cmdlet 进行单元测试

转载 作者:行者123 更新时间:2023-12-04 16:42:33 25 4
gpt4 key购买 nike

我写了一个simple PowerShell cmdlet in C#炫耀我遇到的问题。随意克隆存储库,或 fork 它并使其工作并提交 PR,或者只是查看源代码以了解我在做什么。

我使用 the PowerShellStandard.Library NuGet package 创建了一个简单的 PowerShell Core cmdlet .我正在使用 xUnit 并尝试针对我创建的 PowerShell cmdlet 运行单元测试。问题是当我调用 cmdlet 实例的 .Invoke() 方法时,它抛出一个 NullReferenceException

这是我创建的 cmdlet:

[Cmdlet(VerbsCommon.Get, "RepeatedString")]
[OutputType(typeof(string))]
public class GetRepeatedStringCmdlet : Cmdlet
{
[Parameter(Position = 0, Mandatory = true, ValueFromPipeline = true, ValueFromPipelineByPropertyName = true)]
[Alias("Word")]
[ValidateNotNullOrEmpty()]
public string Phrase { get; set; }

[Parameter(Position = 1, Mandatory = true, ValueFromPipelineByPropertyName = true)]
[Alias("Repeat")]
public int NumberOfTimesToRepeatPhrase { get; set; }

protected override void ProcessRecord()
{
base.ProcessRecord();

var result = new StringBuilder();
for (int i = 0; i < NumberOfTimesToRepeatPhrase; i++)
{
result.Append(Phrase);
}

WriteObject(result.ToString());
}
}

这是我尝试运行的单元测试的示例:

[Fact]
public void ShouldReturnThePhraseRepeatedTheCorrectNumberOfTimes()
{
// Arrange.
var phrase = "A test phrase.";
int numberOfTimesToRepeat = 3;
var cmdlet = new GetRepeatedStringCmdlet()
{
Phrase = phrase,
NumberOfTimesToRepeatPhrase = numberOfTimesToRepeat
};
var expectedResult = Enumerable.Repeat(phrase, numberOfTimesToRepeat);

// Act.
var enumerator = cmdlet.Invoke().GetEnumerator(); // NullReferenceException thrown here when calling .Invoke().
Assert.True(enumerator.MoveNext());
var results = enumerator.Current;

// Assert.
Assert.Equal(results, expectedResult);
}

当我在 PowerShell 中测试脚本时,它似乎可以正常工作:

ImportModule .\PowerShellCmdletInCSharpExample.dll
Get-RepeatedString -Phrase "Hello there" -NumberOfTimesToRepeatPhrase 3
Hello thereHello thereHello there

我正在关注我在一些博客文章中找到的示例,like this onethis one ,但我猜他们在调用 .Invoke() 时没有这个问题。其他博文,like this one ,使用 PsCmdletAssert 类来 .Invoke() cmdlet,但该类似乎不存在于 PowerShellStandard.Library NuGet 包中,所以我猜这不是一个 PowerShell Core 友好类。 Other blogs在每次测试执行时创建一个新的运行空间和管道,但同样,我在使用 PowerShellStandard 库时似乎没有 CreatePipeline() 函数。

所以我的问题是,如何针对我在 C# 中创建的 PowerShell Core Cmdlet 运行 xUnit 测试以验证它们是否按预期运行?

提前致谢!


更新

使用 System.Management.Automation.dll 的 .Net Framework 版本在 Invoke()ing cmdlet 时不会抛出异常,因此我的解决方法是一直将我的单元测试项目定义为 .Net Framework 项目,而不是 .Net Core。这使我能够使用本文中显示的代码按预期对 cmdlet 进行单元测试。该 cmdlet 仍然在 .Net Core 项目中定义并且是跨平台的,只有单元测试不是。

PowerShellStandard.Library NuGet 包的最新版本是 5.1.0,因此希望这个问题在未来的版本中得到解决。

最佳答案

我遇到了同样的问题。我能够通过安装 Microsoft.PowerShell.SDK 来解决这个问题进入我的单元测试项目,于是我的 Cmdlet.Invoke()Powershell.Create() 调用开始正常工作。

关于c# - 如何在 C# 中对 PowerShell Core 二进制 cmdlet 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56696574/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com