有没有一种方法可以对C#中的顶级语句进行单元测试



我一直在摆弄顶级语句作为简单控制台应用程序的入口点,因为新的.NET6模板将它们用作默认值。

然而,正如语言规范非常明确地指出的那样:

注意;程序";以及";主";仅用于说明目的,编译器使用的实际名称取决于实现,并且类型和方法都不能通过源代码中的名称引用

因此,如果我不能引用隐式Program类及其Main()方法,是否可以编写单元测试来检查顶级语句本身的执行流?如果是,如何?

是。一种选择(自.NET6以来(是使测试项目的内部对测试项目可见,例如通过向csproj:添加下一个属性

<ItemGroup>
<InternalsVisibleTo Include ="YourTestProjectName"/>
</ItemGroup>

然后,为顶级语句生成的Program类应该对测试项目可见,您可以使用下一种方式运行它:

var entryPoint = typeof(Program).Assembly.EntryPoint!;
entryPoint.Invoke(null, new object[] { Array.Empty<string>() }); 

类似这样的东西在内部用于对具有最小托管模型的ASP.NET Core 6执行集成测试。

请注意,如果在顶级语句中使用await,则生成的Main方法可以返回task,因此您可能需要捕获entryPoint.Invoke的返回并测试它是否是Taskawait

另一种方法是显式地将Program类声明为分部类(例如,在顶层语句的末尾,并在测试项目中使用它(:

// ...
// your top-level statements
public partial class Program { }

相关内容

  • 没有找到相关文章

最新更新