我一直在摆弄顶级语句作为简单控制台应用程序的入口点,因为新的.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
的返回并测试它是否是Task
和await
另一种方法是显式地将Program
类声明为分部类(例如,在顶层语句的末尾,并在测试项目中使用它(:
// ...
// your top-level statements
public partial class Program { }